过滤R xts对象以排除某个日期

时间:2018-03-31 16:44:22

标签: r xts

我想将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'))]

2 个答案:

答案 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