给定这样的数据框:
A <- c(1,2,3,4,NA,6,7,8,9,10,11,12,13,14,15)
B <- c(NA,NA,NA,20,NA,NA,NA,15,NA,NA,NA,NA,11,NA,9)
DF <- data.frame(A, B)
我想根据B列中的值来计算A列中某个值范围的平均值。具体地说,每当B列中存在一个非NA值时,我都想计算该范围的平均值。 A列上方第2行和下方第2行。
例如,列B中的第一个非NA值是20。因此,我想计算(2,3)上方两行,(NA,6)下方两行以及相邻(4)行的平均值。所以:
mean(2,3,4,NA,6)
同样,行B中的下一个非NA值是15。
mean(6,7,8,9,10)
因此,整个数据帧的最终结果将是新的列C
DF$C <- c(NA,NA,NA,3.75,NA,NA,NA,8,NA,NA,NA,NA,13,NA,14)
您可以尝试以下方法。
nona <- !is.na(DF$B)
DF$C <- replace(
DF$B,
nona,
vapply(which(nona), function(i) {
ii <- (i-2):(i+2)
mean(DF$A[ii[ii > 0]], na.rm = TRUE)
}, 1)
)
在这里,我们在B列中找到非NA值,然后使用该向量为我们要在A列中找到平均值的值设置索引,请小心删除如果第一个下标可能出现的任何负下标或B列的两个值不为NA。上面的代码给出了的以下结果DF
。
A B C
1 1 NA NA
2 2 NA NA
3 3 NA NA
4 4 20 3.75
5 NA NA NA
6 6 NA NA
7 7 NA NA
8 8 15 8.00
9 9 NA NA
10 10 NA NA
11 11 NA NA
12 12 NA NA
13 13 11 13.00
14 14 NA NA
15 15 9 14.00
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句