繁体   English   中英

计算一系列行的平均值

[英]Calculate mean of a range of rows

给定这样的数据框:

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列中的第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

这是zoo包的一种方法:

library(zoo)
width <- 5   # the observation ± 2

DF$C <- rollapply(DF$A, width, mean, na.rm = TRUE, partial = TRUE)

# when DF$B is NA, assign NA to corresponding DF$C
DF$C[is.na(DF$B)] <- NA

partial = TRUE允许在DF$A向量的前导和尾随部分计算均值,其中整个窗口无法容纳(即DF$A的前2个和后2个值,其中有一个窗口大小5是不可能的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM