我想将xts
对象分组以排除某个日期。这是一个简单的例子。
# This subsets to March 30, I would like to exclude that date instead
library(xts)
xts1 <- xts(x=1:10, order.by=as.Date('2018-03-31')-1:10)
xts1['2018-03-30']
这两行有效。
xts1[-which(index(xts1) == '2018-03-30')]
xts1[!(index(xts1) %in% as.Date('2018-03-30'))]
上述两个中的第二个是优选的,因为它对于xts
对象中不存在的日期是健壮的。例如......
# returns empty xts
xts1[-which(index(xts1) == '1960-03-30')]
# returns full xts
xts1[!(index(xts1) %in% as.Date('1960-03-30'))]
似乎会有一个不那么冗长和更好的练习方法,如下面(不起作用)。
xts1[-'2018-03-30']
xts1[!'2018-03-30']
有没有比我的解决方案更好的方法呢? (即xts1[-which(index(xts1) == '2018-03-30')]
,xts1[!(index(xts1) %in% as.Date('2018-03-30'))]
)
答案 0 :(得分:1)
很抱歉,我无法发表评论,因为我的声誉有50,但我认为@AndrewGustar给出的答案是最好的。
which
返回索引向量,其中提供的逻辑测试在对象中得到满足。更清楚的是,如果你运行
> index(xts1) != '2018-03-30'
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
你得到的是一个布尔矢量。现在,如果您将其提供给which
函数
> which(index(xts1) != '2018-03-30')
[1] 1 2 3 4 5 6 7 8 9
您可以参考?which
,但它实际上会在xts1
中吐出逻辑测试为TRUE
的索引。
然后,您可以使用此索引向量选择xts1
内的数据
xts1[which(index(xts1) != '2018-03-30')]
但是,xts
个对象也可以使用布尔向量进行切片。因此,您可以使用逻辑测试进行切片,并且它可以正常工作
> xts1[index(xts1) != '2018-03-30']
[,1]
2018-03-21 10
2018-03-22 9
2018-03-23 8
2018-03-24 7
2018-03-25 6
2018-03-26 5
2018-03-27 4
2018-03-28 3
2018-03-29 2
答案 1 :(得分:0)
一种方法是在which.i = TRUE
中使用set [.xts
,它将返回索引位置而不是xts对象的子集。
例如:
(rmrow <- xts1["2018-03-30", which.i = TRUE])
# [1] 10
(xts2 <- xts1[-rmrow, ])
# [,1]
# 2018-03-21 10
# 2018-03-22 9
# 2018-03-23 8
# 2018-03-24 7
# 2018-03-25 6
# 2018-03-26 5
# 2018-03-27 4
# 2018-03-28 3
# 2018-03-29 2