質問
名前付きベクトルがあるとします。 bar
:
bar=c()
bar["1997-10-14"]=1
bar["2001-10-14"]=2
bar["2007-10-14"]=1
どうすれば選択できますか bar
インデックスが特定の日付範囲内にあるすべての値?したがって、私が間にすべての値を探す場合 "1995-01-01"
と "2000-06-01"
, 、私は得るべきです 1
. 。同様に、間の期間について "2001-09-01"
と "2007-11-04"
, 、私は得るべきです 2
と 1
.
解決
この問題は、それとうまく解決されました XTS から機能を拡張するパッケージ 動物園 パッケージ。
R> library(xts)
Loading required package: zoo
R> bar <- xts(1:3, order.by=as.Date("2001-01-01")+365*0:2)
R> bar
[,1]
2001-01-01 1
2002-01-01 2
2003-01-01 3
R> bar["2002::"] ## open range with a start year
[,1]
2002-01-01 2
2003-01-01 3
R> bar["::2002"] ## or end year
[,1]
2001-01-01 1
2002-01-01 2
R> bar["2002-01-01"] ## or hits a particular date
[,1]
2002-01-01 2
R>
ここにはもっとたくさんありますが、基本的なポイントはそうです いいえ 日付を装った文字列を操作します。
使う Date
タイプ、またはできれば数百万の日付で効率的にインデックスを作成するように構築された拡張機能パッケージもできます。
他のヒント
日付をキャラクターからに変換する必要があります Date
でタイプします as.Date()
(または、時刻のような詳細情報がある場合はPOSIXタイプ)。その後、標準と比較することができます リレーショナル演算子 <= and> =など。
次のようなタイムリーパッケージの使用を検討する必要があります zoo
このため。
編集:
コメントに応答するために、既存のベクトルで日付を使用する例を次に示します。
> as.Date(names(bar)) < as.Date("2001-10-14")
[1] TRUE FALSE FALSE
> bar[as.Date(names(bar)) < as.Date("2001-10-14")]
1997-10-14
1
ただし、タイムシリーズパッケージを使用するだけです。これがどのようにこれを行うことができますか zoo
(また xts
, timeSeries
, fts
, 、など):
library(zoo)
ts <- zoo(c(1, 2, 1), as.Date(c("1997-10-14", "2001-10-14", "2007-10-14")))
ts[index(ts) < as.Date("2001-10-14"),]
インデックスは今であるためです Date
タイプ、必要なだけ比較することができます。読む zoo
詳細については、ビネット。
日付が語彙順にあるという事実を使用してください:
bar[names(bar) > "1995-01-01" & names(bar) < "2000-06-01"]
# 1997-10-14
# 1
bar[names(bar) > "2001-09-01" & names(bar) < "2007-11-04"]
# 2001-10-14 2007-10-14
# 2 1
結果の名前はVectorです(元のように bar
, 、それはVectorという名前のリストではありません)。
ダークが彼の答えで述べているように、使用する方が良いです Date
効率的な理由から。外部パッケージがなければ、データを再配置して2つのベクトル(または2列)を作成できます data.frame
)日付用、1つは価値のためです。
bar_dates <- as.Date(c("1997-10-14", "2001-10-14", "2007-10-14"))
bar_values <- c(1,2,1)
次に、単純なインデックス作成を使用します。
bar_values[bar_dates > as.Date("1995-01-01") & bar_dates < as.Date("2000-06-01")]
# [1] 1
bar_values[bar_dates > as.Date("2001-09-01") & bar_dates < as.Date("2007-11-04")]
# [1] 2 1