25

日付列と他のいくつかの値列を持つデータフレームがあります。データフレームから、日付列が既存の日付リストの要素のいずれかと一致する行を抽出したいと思います。たとえば、1つの要素のリストを使用すると、日付「2012-01-01」はデータフレームから日付「2012-01-01」の行をプルします。

数字については、値を一致させる方法を知っていると思います。このコード:

testdf <- data.frame(mydate = seq(as.Date('2012-01-01'), 
                                  as.Date('2012-01-10'), by = 'day'),
                     col1 = 1:10,
                     col2 = 11:20,
                     col3 = 21:30)

...このデータフレームを生成します:

       mydate col1 col2 col3
1  2012-01-01    1   11   21
2  2012-01-02    2   12   22
3  2012-01-03    3   13   23
4  2012-01-04    4   14   24
5  2012-01-05    5   15   25
6  2012-01-06    6   16   26
7  2012-01-07    7   17   27
8  2012-01-08    8   18   28
9  2012-01-09    9   19   29
10 2012-01-10   10   20   30

私がすることができます:

testdf[which(testdf$col3 %in% c('25','29')),]

これを生成します:

      mydate col1 col2 col3
5 2012-01-05    5   15   25
9 2012-01-09    9   19   29

私はこれを次のようなリストに一般化することができます:

myvalues <- c('25','29')
testdf[which(testdf$col3 %in% myvalues),]

そして、私は同じ出力を取得します。だから、同じアプローチでデートできると思っていたのですが、間違っていたようです。これを行う:

testdf[which(testdf$mydate %in% c('2012-01-05','2012-01-09')),]

私にこれを取得します:

[1] mydate col1   col2   col3  
<0 rows> (or 0-length row.names)

そして、彼ら自身のリストに日付をポップすること(これは究極の目的です)も役に立ちません。ループまたはapply関数を使用してこれを回避する方法を考えることができますが、おそらくかなり一般的な要件に対して、より簡単な方法が必要であるように思われます。簡単なことをもう一度見落としたのでしょうか。

Q:日付のリストの1つと値が一致する日付列を持つデータフレームの行をサブセット化するにはどうすればよいですか?

4

3 に答える 3

25

(コンソールで試してください)を使用して、日付stringDate変数に変換する必要があります。ボーナス:あなたはどれを落とすことができます:as.Date?as.Date

> testdf[testdf$mydate %in% as.Date(c('2012-01-05', '2012-01-09')),]
      mydate col1 col2 col3
5 2012-01-05    5   15   25
9 2012-01-09    9   19   29
于 2012-07-13T05:26:51.893 に答える
11

これまでのところ、どちらの提案も間違いなく良いものですが、日付を使って多くの作業を行う場合は、xtsパッケージに時間を費やすことをお勧めします。

# Some sample data for 90 consecutive days 
set.seed(1)
testdf <- data.frame(mydate = seq(as.Date('2012-01-01'), 
                                  length.out=90, by = 'day'),
                     col1 = rnorm(90), col2 = rnorm(90),
                     col3 = rnorm(90))

# Convert the data to an xts object
require(xts)
testdfx = xts(testdf, order.by=testdf$mydate)

# Take a random sample of dates
testdfx[sample(index(testdfx), 5)]
#                   col1        col2        col3
# 2012-01-17 -0.01619026  0.71670748  1.44115771
# 2012-01-29 -0.47815006  0.49418833 -0.01339952
# 2012-02-05 -0.41499456  0.71266631  1.51974503
# 2012-02-27 -1.04413463  0.01739562 -1.18645864
# 2012-03-26  0.33295037 -0.03472603  0.27005490

# Get specific dates
testdfx[c('2012-01-05', '2012-01-09')]
#                 col1      col2       col3
# 2012-01-05 0.3295078  1.586833  0.5210227
# 2012-01-09 0.5757814 -1.224613 -0.4302118

別のベクトルから日付を取得することもできます。

# Get dates from another vector
lookup = c("2012-01-12", "2012-01-31", "2012-03-05", "2012-03-19")
testdfx[lookup]
testdfx[lookup]
#                   col1        col2       col3
# 2012-01-12  0.38984324  0.04211587  0.4020118
# 2012-01-31  1.35867955 -0.50595746 -0.1643758
# 2012-03-05 -0.74327321 -1.48746031  1.1629646
# 2012-03-19  0.07434132 -0.14439960  0.3747244

このxtsパッケージは、インテリジェントなサブセット化オプションを提供します。たとえば、testdfx["2012-03"]3月のすべてのデータを返します。testdfx["2012"]その年に戻ってきます。testdfx["/2012-02-15"]データセットの開始から2月15日までのデータを返します。testdfx["2012-02-15/"]2月15日からデータセットの最後まで移動します。

于 2012-07-13T07:44:48.060 に答える
3

または、@ RYogiが提案したものに逆戻りしDateて、を文字列に変換することもできます。

testdf[as.character(testdf$mydate) %in% c('2012-01-05', '2012-01-09'),]
      mydate col1 col2 col3
5 2012-01-05    5   15   25
9 2012-01-09    9   19   29

編集:タイミング

日付を文字列に変換する方が少し高速ですが、実際には違いはありません。

library(rbenchmark)
benchmark(asDate=testdf[testdf$mydate %in% as.Date(c('2012-01-05', '2012-01-09')),],
  asString=testdf[as.character(testdf$mydate) %in% c('2012-01-05', '2012-01-09'),], 
  replications=1000)

#     test replications elapsed relative user.self sys.self user.child
# 1   asDate         1000   0.211 1.076531     0.212        0          0
# 2 asString         1000   0.196 1.000000     0.192        0          0
#  sys.child
# 1         0
# 2         0
于 2012-07-13T05:36:32.997 に答える