不明白rollapply在做什么

时间:2018-06-19 16:15:15

标签: r zoo

z <- zoo::zoo(1:5, as.Date(0:4))
z
1970-01-01 1970-01-02 1970-01-03 1970-01-04 1970-01-05 
         1          2          3          4          5 

然后尝试:

rollapply(z, 1:2, sum, align = "left")
1970-01-01 1970-01-02 1970-01-03 1970-01-04 1970-01-05 
         1          5          3          9          5 

我没有看到z和rollapply()函数调用之间的联系。我的假设是,我将有一个向量,两个长(1:2),该向量将重叠在z内的每个观测值上,并根据我的函数求和而聚集。

z中的第一个数字是1,而我通话中的第一个数字也是1。确定是有道理的,1的总和不等于1。

z中的第二个实例是2,而rollapply中的第二个结果是5。我可以看到z中第二个和第三个条目的总和是5,但是如果是这样,那么第三个实例的结果就不会rollapply是3 + 4 = 7而不是3。对于第三种情况,我的rollapply调用如何返回3?

r在这里到底在做什么?

1 个答案:

答案 0 :(得分:4)

窗口在宽度1和宽度2之间交替显示。结果为1,然后是2 + 3,然后是3,然后是4 + 5,然后是5。

这里是rollapply输出,其窗口宽度为1(第1列),窗口宽度为2(第2列)。您会看到它只是在这两者之间交替出现。

sapply(1:2, function(w) rollapply(z, w, sum, align = 'left', fill = NA))
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    5
# [3,]    3    7
# [4,]    4    9
# [5,]    5   NA

如果您既想要又想要保留属性,则可以使用lapply

lapply(1:2, function(w) rollapply(z, w, sum, align = 'left', fill = NA))

# [[1]]
# 1970-01-01 1970-01-02 1970-01-03 1970-01-04 1970-01-05 
#          1          2          3          4          5 
# 
# [[2]]
# 1970-01-01 1970-01-02 1970-01-03 1970-01-04 1970-01-05 
#          3          5          7          9         NA

如果您提供更大的向量作为rollapply的第二个参数,则会发生同样的事情

rollapply(1:10, 2:4, sum)
# [1]  3  6 14  9 15 26 15 24
sapply(2:4, function(w) rollapply(1:10, w, sum, fill = NA))
#       [,1] [,2] [,3]
#  [1,]    3   NA   NA
#  [2,]    5    6   10
#  [3,]    7    9   14
#  [4,]    9   12   18
#  [5,]   11   15   22
#  [6,]   13   18   26
#  [7,]   15   21   30
#  [8,]   17   24   34
#  [9,]   19   27   NA
# [10,]   NA   NA   NA