インデックスとして日付を使用してベクトルから値を選択します

StackOverflow https://stackoverflow.com/questions/2736631

  •  02-10-2019
  •  | 
  •  

質問

名前付きベクトルがあるとします。 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", 、私は得るべきです 21.

役に立ちましたか?

解決

この問題は、それとうまく解決されました 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top