我有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的新人.
提前致谢.
使用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)