2

我想排除那些x2等于零超过预定次数(即同一天> 300)的日子:

library(xts)
set.seed(1)
tmp <- seq(as.POSIXct('2013-09-03 00:00:01'),
           as.POSIXct('2013-09-06 23:59:59'), by='min')
x1 <- rnorm(length(tmp))
x2 <- rnorm(length(tmp))
x2 [1:400] <- 0

x <- xts(cbind(x1, x2), tmp)

我发现.indexday函数可以在几天内进行子集化,因此一种可能性是编写一个按天进行子集化的 for 循环并计算其上的元素数x2为零,但我确信有一种更有效的方法。

如果x没有 300 多个带有x2 == 0.

4

2 回答 2

2

无论您使用哪种解决方案,在从 POSIXt 转换为 Date 时都需要注意时区。这是使用的解决方案ave

> x <- xts(cbind(x1, x2), tmp, tzone="UTC")
> y <- x[ave(x$x2==0, as.Date(index(x)), FUN=sum) < 300,]
> head(y)
                            x1         x2
2013-09-04 00:00:01  0.6855122  0.8171146
2013-09-04 00:01:01  0.3895035  0.1818066
2013-09-04 00:02:01 -1.3053959  1.2532384
2013-09-04 00:03:01  1.2168880  0.6069871
2013-09-04 00:04:01  0.7951740  0.2825354
2013-09-04 00:05:01 -0.4882025 -0.3089424
于 2013-09-10T13:35:49.457 回答
1

这是一个解决方案:

##split idx object with respect to days
aa <- split.xts(x, f="days")

## get indices of days for which x2 == 0 less than 300 times
idx <- which(lapply(aa, function(xx){length(which(xx[,"x2"]==0))}) <= 300)

idx
[1] 2 3 4

##make one xts object containing only the desired days
new.x <- do.call(rbind, aa[idx])

dim(x)
[1] 5760    2

dim(new.x)
[1] 4320    2
于 2013-09-10T13:23:32.260 回答