我有一个数据帧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的任何帮助?
答案 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)