在对列进行求和时管理NA的R表达式

lfu*_*nte 5 r

我有5列数字数据(m1,m2,m3,m4,m5),我想生成一个新列,其中包含同一行中所有m的平均值.那是:

(m1 + m2 + m3 + m4 + m5)/5
Run Code Online (Sandbox Code Playgroud)

我对NA值的管理存在问题:当且仅当m的所有单个值都是NA时,我希望平均值为NA.但是,如果我使用na.rm,则NA用零替换,并且NA不在平均值列中.另一方面,如果我不使用na.rm,如果m的任何一个是NA,则平均值列是NA.

我做了以下事情:

m <- rowSums(data.frame(m1,m2,m3,m4,m5)/5, na.rm=TRUE)

for (i in 1:length(m)) {
    if ( all(is.na(c(m1[i],m2[i],m3[i],m4[i],m5[i])))) {
        m[i] <- NA
    }
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我几乎可以肯定R可以更好地完成它.如何在没有循环的情况下完成?

也许这个问题听起来有点微不足道.对不起,但我是R的新人.

提前致谢.

Jor*_*eys 5

使用rowMeans而不是rowSums:

Df <- data.frame(
  m1 = c(NA,1:10,NA),
  m2 = c(10:5,NA,4:1,NA),
  m3 = c(11,12,NA,13:20,NA)
)
rowMeans(Df,na.rm=T)
[1] 10.500000  7.333333  5.000000  7.666667  8.000000  8.333333 11.000000 
    9.333333  9.666667 10.000000 10.333333        NA
Run Code Online (Sandbox Code Playgroud)