R中的滑动窗口

时间:2013-04-11 07:53:42

标签: r dataframe sliding-window

我有一个数据帧DF,下面有两列A和B:

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

如下所示执行滑动窗口方法。使用以下方式在大小为3的滑动窗口中对列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的任何帮助?

2 个答案:

答案 0 :(得分:4)

试试这个:

# 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

答案 1 :(得分:0)

R库TTR有许多用于计算滑动窗口平均值的函数

SMA =简单移动平均值

data$sma <- SMA(data$B, 3)

此处有更多文档http://cran.r-project.org/web/packages/TTR/TTR.pdf