这可能有些愚蠢,但我希望有更好的方法来解决这个问题。我有一个数据框如下
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
虽然感觉有些尴尬,但我想知道是否有更聪明的方法来解决这个问题。
答案 0 :(得分:2)
如果所有行元素都为apply
,则每行使用margin = 1
和NA
,我们会返回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