当所有元素都是NA时,NA作为操作的结果

时间:2017-11-07 04:02:47

标签: r

这可能有些愚蠢,但我希望有更好的方法来解决这个问题。我有一个数据框如下

a <- matrix(1,5,3)
a[1:2,2] <- NA
a[1,c(1,3)] <- NA
a[3:5,2] <- 2
a[2:5,3] <- 3 
a <- data.frame(a)
colnames(a) = c("First", "Second", "Third")

我只想对列中的一些进行求和,但是当总和列中的所有元素都是NA时,我想保留NAs。简而言之,如果我将第一列和第二列相加,我想获得类似

的内容
mySum <- c(NA, 1, 3, 3, 3)

以下两个选项都没有提供我想要的内容

rowSums(a[, c("First", "Second")])
rowSums(a[, c("First", "Second")], na.rm=TRUE)

但从积极的方面来说,我已经通过使用is.na和所有

的组合解决了这个问题
mySum <- rowSums(a[, c("First", "Second")], na.rm=TRUE)
iNA = apply(a[, c("First", "Second")], 2, is.na)
iAllNA = apply(iNA, 1, all)
mySum[iAllNA] = NA

虽然感觉有些尴尬,但我想知道是否有更聪明的方法来解决这个问题。

2 个答案:

答案 0 :(得分:2)

如果所有行元素都为apply,则每行使用margin = 1NA,我们会返回NA,否则我们会返回sum

apply(a[c("First", "Second")], 1, function(x) 
                          ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE)))

#[1] NA  1  3  3  3

答案 1 :(得分:1)

mycols = c("First", "Second")
replace(x = rowSums(a[mycols], na.rm = TRUE),
        list = rowSums(is.na(a[mycols])) == length(mycols),
        values = NA)
#[1] NA  1  3  3  3