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

时间:2011-04-05 10:45:02

标签: r

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

(m1 + m2 + m3 + m4 + m5)/5

我对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
    }
}

它有效,但我几乎可以肯定R可以更好的方式做到这一点。如何在没有循环的情况下完成?

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

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

答案非常简单,当我透露所有内容时你会踢自己; - )

首先是一个可重复的例子:

set.seed(1)
dat <- matrix(runif(100*5), ncol = 5)
## add some random NA
dat[sample(NROW(dat) * NCOL(dat), 100)] <- NA
dat <- data.frame(dat)
names(dat) <- paste("m", 1:5, sep = "")
## make 1 row all NA
dat[10, ] <- rep(NA, NCOL(dat))

解决方案是使用rowMeans()而不是rowSums()

> rowMeans(dat, na.rm = TRUE)
  [1] 0.5040661 0.2447789 0.5785721 0.6552587 0.5000273 0.6553183
  [7] 0.5017969 0.5961018 0.3778305        NA 0.7843261 0.3118411
 [13] 0.6023241 0.7230658 0.4849793 0.3579792 0.5321065 0.5891246
 [19] 0.5985094 0.6450797 0.5884122 0.3308921 0.4659702 0.3595603
 [25] 0.6291160 0.5420563 0.3555441 0.3922415 0.4554090 0.6912613
 [31] 0.5849739 0.1436432 0.3363359 0.5620860 0.4845476 0.6243143
 [37] 0.6453576 0.3102552 0.6801590 0.5730385 0.6595771 0.4125847
 [43] 0.5950305 0.3908888 0.5228980 0.4290490 0.3219740 0.4941847
 [49] 0.3203416 0.6077816 0.6725149 0.6037703 0.4706785 0.3780164
 [55] 0.2773157 0.2887002 0.5679866 0.5216224 0.4181383 0.4182203
 [61] 0.3985725 0.4043380 0.3024113 0.5441925 0.6163834 0.5365182
 [67] 0.3324975 0.5444736 0.6809868 0.5073465 0.4122997 0.6164483
 [73] 0.4803133 0.3044119 0.2990064 0.5280371 0.5925953 0.6079630
 [79] 0.5144217 0.7415579 0.4059379 0.3966217 0.7344768 0.7502413
 [85] 0.4064067 0.2837371 0.6139601 0.3669062 0.5450748 0.4665940
 [91] 0.3618159 0.4623254 0.5885807 0.4686613 0.4246080 0.6322250
 [97] 0.2747088 0.4716259 0.4306550 0.1015050

使用两种方法比较第10行的条目:

> rowMeans(dat, na.rm = TRUE)[10]
[1] NA
> rowSums(dat/5, na.rm = TRUE)[10]
[1] 0