我有一个1的x和0表示某个日期的事件。我想在索引的每个星期五进行R循环,看看那个星期是否有1个。我有这个:
> this = xts(sample(c(0,1), replace=TRUE, size=10),
order.by = seq.Date(as.Date('1990-01-05'), by = 1, length.out=10))
> this
[,1]
1990-01-05 0
1990-01-06 1
1990-01-07 0
1990-01-08 0
1990-01-09 0
1990-01-10 0
1990-01-11 1
1990-01-12 0
1990-01-13 0
1990-01-14 0
> that = index(this)[.indexwday(this) == 5]
> that
[1] "1990-01-05" "1990-01-12"
> period.apply(this, INDEX=that, FUN=function(x) max(x))
Error in `[.xts`(x, (INDEX[y] + 1):INDEX[y + 1]) :
subscript out of bounds
如您所见,我收到错误。有什么帮助吗?
编辑:
所以我想出了错误。 'INDEX'应该是矢量或行号,而不是日期。这有效:
period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) max(x))
但是,我坚持原来的问题。我不知道如何在系列中第一次出现1。我试过这个:
> period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) index(x)[min(which(x==1))])
[,1]
1990-01-05 7309
1990-01-12 7310
但我不知道这些是什么。我猜测索引不会通过'x'传递给函数。
关于如何做我正在尝试的事情的任何想法?
答案 0 :(得分:0)
我想在索引的每个星期五进行R循环并查看 如果那个星期有1个
不清楚你想要什么,所以这会计算你一周中的事件数量。
7309,7310对应于您使用index(x)返回的日期的数值[...]
period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) { sum(x==1)})
答案 1 :(得分:0)
如果您希望每周的第一天xts对象的值为1,您可以:
split
您的xts对象进入每周的数据列表lapply
一个函数,用于查找等于1的第一个观察值,rbind
将列表放入单个xts对象中。这是一个例子:
set.seed(21)
this <- xts(sample(0:1, 10, TRUE), seq(as.Date("1990-01-05"), by=1, length.out=10))
first1 <- function(x) first(x[x==1])
weeklist <- split(this, "weeks")
week1 <- do.call(rbind, lapply(weeklist, first1))
以下是样本数据和结果:
R> this
[,1]
1990-01-05 1
1990-01-06 0
1990-01-07 1
1990-01-08 0
1990-01-09 1
1990-01-10 1
1990-01-11 0
1990-01-12 0
1990-01-13 1
1990-01-14 1
R> week1
[,1]
1990-01-05 1
1990-01-09 1