“下标出界。”在period.apply

时间:2017-04-18 12:25:32

标签: r xts

我有一个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'传递给函数。

关于如何做我正在尝试的事情的任何想法?

2 个答案:

答案 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,您可以:

  1. split您的xts对象进入每周的数据列表
  2. lapply一个函数,用于查找等于1的第一个观察值,
  3. rbind将列表放入单个xts对象中。
  4. 这是一个例子:

    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