使用Date作为索引从矢量中选择值

时间:2010-04-29 10:44:07

标签: r xts

假设我有一个命名向量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 个答案:

答案 0 :(得分: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类型,或者最好使用构建的扩展程序包来有效地索引数百万个日期。

答案 1 :(得分:2)

您需要将日期从字符转换为Date类型as.Date()(如果您有更多信息,如时间,则需要POSIX类型)。然后,您可以与标准relational operators进行比较,例如&lt; =和&gt; =。

您应该考虑使用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插图。

答案 2 :(得分: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 

结果被命名为vector(就像你原来的bar一样,它不是一个名为vector的列表。)

正如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