假设我有一个命名向量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
。
答案 0 :(得分:4)
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
(或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
插图。
答案 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