假設我有一個名爲向量,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
。
假設我有一個名爲向量,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封裝解決了該問題,它擴展了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
類型,或者最好使用一個擴展包,以便在數百萬個日期上進行有效索引。
您需要將日期從字符轉換爲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
(或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
小插曲以獲取更多信息。
嗯,我可能會做錯,但如果我做一些像酒吧[as.Date(「2001-10-14」)]我得到非常奇怪的結果涉及許多新手 – Pieter 2010-04-29 11:40:59
用事實日期詞彙順序:
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
僅供參考:您正在創建一個已命名的數字向量,而不是一個列表。 – Shane 2010-04-29 12:52:40