假设我有一个指定的向量, 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.

有帮助吗?

解决方案

这个问题已经解决了 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 类型,或者最好是构建的扩展程序包,以有效地索引数百万日期。

其他提示

您需要将日期从字符转换为 Dateas.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, , ETC。):

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 Vignette以获取更多信息。

使用日期按词汇顺序进行的事实:

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的列表)。

正如德克在他的回答中所说的那样,最好使用 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top