我想排除那些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循环的for循环,并计算x2
上等于零的元素数量但是我确信有一种更有效的方法。
输出将是同一个对象x
,而不包含超过300个x2 == 0
个案例的日期。
答案 0 :(得分: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
答案 1 :(得分: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