2010-04-29 28 views
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"之間,我應該得到21

+3

僅供參考:您正在創建一個已命名的數字向量,而不是一個列表。 – Shane 2010-04-29 12:52:40

回答

4

這個問題已經xts封裝解決了該問題,它擴展了zoo封裝的功能。

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類型,或者最好使用一個擴展包,以便在數百萬個日期上進行有效索引。

2

您需要將日期從字符轉換爲Date類型,其中as.Date()(或POSIX類型,如果您有更多信息,例如時間)。然後,您可以使用標準relational operators進行比較,如< =和> =。

您應該考慮使用時間序列軟件包,例如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(或xtstimeSeriesfts等),這樣做:

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小插曲以獲取更多信息。

+0

嗯,我可能會做錯,但如果我做一些像酒吧[as.Date(「2001-10-14」)]我得到非常奇怪的結果涉及許多新手 – Pieter 2010-04-29 11:40:59

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,這不是它的命名向量列表)。

正如Dirk在答覆中所述,出於效率的原因,最好使用Date。如果沒有外部包,你可以重新安排你的數據,並創建兩個向量(或兩列data.frame)一個日期,一個值:

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