1

名前付きベクトル があるとし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ます。

4

3 に答える 3

4

この問題は、 zooパッケージの機能を拡張する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何百万もの日付を効率的にインデックス化するために構築されたタイプ、またはできれば拡張パッケージを使用してください。

于 2010-04-29T12:30:30.690 に答える
2

Date日付を文字から型as.Date()(または時刻などの詳細情報がある場合は POSIX 型)に変換する必要があります。次に、<= や >= などの標準の関係演算子を使用して比較を行うことができます。

このような時系列パッケージの使用を検討する必要があります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詳細については、ビネットを お読みください。

于 2010-04-29T11:02:56.513 に答える
1

日付が字句順であるという事実を使用します。

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 

結果はベクトルという名前です(元barのように、ベクトルという名前のリストではありません)。

ダークが彼の答えで述べているようにDate、効率的な理由から使用する方が良いです。data.frame外部パッケージがなければ、データを再配置して、日付用と値用の2 つのベクトル (または 2 列) を作成できます。

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
于 2010-04-29T12:09:20.043 に答える