R中的滑动窗口

5

我有一个数据框 DF,其中包含两列 A 和 B,如下所示:

A                    B                  
1                    0             
3                    0               
4                    0                   
2                    1                    
6                    0                    
4                    1                     
7                    1                 
8                    1                     
1                    0   

执行滑动窗口方法如下所示。对于大小为3且每次移动1的滑动窗口中的B列计算平均值,使用rollapply(DF$B, width=3, by=1)。每个窗口的平均值显示在左侧。
    A:         1    3    4    2    6    4    7    8    1                                          
    B:         0    0    0    1    0    1    1    1    0                                
              [0    0    0]                                              0
                    [0    0    1]                                        0.33
                          [0    1    0]                                  0.33
                                [1    0    1]                            0.66
                                      [0    1    1]                      0.66
                                            [1    1    1]                1
                                                 [1    1    0]           0.66
output:        0   0.33 0.33 0.66   0.66    1     1    1   0.66

现在,针对列A中的每一行/坐标,将考虑包含该坐标的所有窗口,并且应保留最高均值,以获得如“输出”栏所示的结果。

我需要获取如上所示的输出。输出应如下:

A                   B                  Output   
1                   0                      0
3                   0                      0.33
4                   0                      0.33
2                   1                      0.66
6                   0                      0.66
4                   1                      1
7                   1                      1
8                   1                      1
1                   0                    0.66

有关 R 的任何帮助?

现在我明白了问题。让我试着看看能否想出什么办法。还有一件事。我认为你在这个编辑中丢失了最终输出“mean_A”。你能也加上它吗?谢谢。 - Arun
@Arun,现在我已经添加了Mean_A。 - chas
@CarlWitthoft,不太准确。user1779730,请看我的答案。 - Arun
抱歉,我没有耐心重新阅读你的问题。完全重写问题也不是推荐的做法。在这些情况下,建议标记该问题的答案并提出一个单独的新问题。 - Arun
更多信息,包括性能问题,可以在http://stats.stackexchange.com/questions/3051/mean-of-a-sliding-window-in-r找到。 - Jasper
显示剩余2条评论
2个回答

6

试试这个:

# form input data
library(zoo)
B <- c(0, 0, 0, 1, 0, 1, 1, 1, 0)

# calculate
k <- 3
rollapply(B, 2*k-1, function(x) max(rollmean(x, k)), partial = TRUE)

最后一行返回:
[1] 0.0000000 0.3333333 0.3333333 0.6666667 0.6666667 1.0000000 1.0000000
[8] 1.0000000 0.6666667

如果存在 NA,您可以尝试以下方法:

k <- 3
B <- c(1, 0, 1, 0, NA, 1)
rollapply(B, 2*k-1, function(x) max(rollapply(x, k, mean, na.rm = TRUE)), partial = TRUE)

最后一行的结果如下:

[1] 0.6666667 0.6666667 0.6666667 0.5000000 0.5000000 0.5000000

将其展开,它们被形成为:

c(mean(B[1:3], na.rm = TRUE), ##
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE)), ##
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE)),
max(mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)),
max(mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)), ##
mean(B[4:6], na.rm = TRUE)) ##

如果您不想保留每端的k-1个组件(上方标有##),请使用partial = TRUE来删除它们。


那里 - 我知道肯定有人能正确表达我上面的评论 :-) - Carl Witthoft
@G.Grothendieck 谢谢。rollapply函数中的5是什么意思? - chas
@G.Grothendieck 非常感谢您提供的简单而有效的解决方案。现在看来,我们可以模拟任何宽度。还有一个问题,我最初使用rollapply(DF$B, width=3,by=1)计算窗口大小为3,滑动1个位置的平均值。但是在您的解决方案中,没有关于滑动by=''参数的内容。我可以假设它以相同的方式滑动1个位置计算平均值吗? - chas
有两个长度为5的窗口。我已经删除了我的评论,因为它们变得太多了,并在答案末尾添加了一些额外的信息。 - G. Grothendieck
@G.Grothendieck。您好,我使用了函数rollapply(x, 2*k-1, function(x) max(rollmean(x, k)), partial = TRUE)->output,并将k设置为5000。输出的前几个值为0.2730、0.2732、0.2732、0.2734、0.2734... 我尝试通过计算mean(x[1:5000])来进行交叉检查,结果为0.3538889。但是rollapply函数的结果从0.2730开始。请问您能解释一下结果不匹配的原因吗? - chas
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接