仅当缺少1或更少时,才特别使用colSums(),na.rm=TRUE

仅当缺少1或更少时,才特别使用colSums(),na.rm=TRUE,r,if-statement,sum,na,na.rm,R,If Statement,Sum,Na,Na.rm,我需要对data.frame中的一些列求和,规则是,如果缺少多个观测值,则将一列求和为NA,如果仅缺少1个或更少,则无论如何都要对其求和 假设我有一些这样的数据 dfn <- data.frame( a = c(3, 3, 0, 3), b = c(1, NA, 0, NA), c = c(0, 3, NA, 1)) dfn a b c 1 3 1 0 2 3 NA 3 3 0 0 NA 4 3 NA 1 我已经玩过colSums(dfn,na.rm=FALSE

我需要对data.frame中的一些列求和,规则是,如果缺少多个观测值,则将一列求和为
NA
,如果仅缺少1个或更少,则无论如何都要对其求和

假设我有一些这样的数据

dfn <- data.frame(
a  = c(3, 3, 0, 3),
b  = c(1, NA, 0, NA),
c  = c(0, 3, NA, 1))

dfn
  a  b  c
1 3  1  0
2 3 NA  3
3 0  0 NA
4 3 NA  1

我已经玩过
colSums(dfn,na.rm=FALSE)
colSums(dfn,na.rm=TRUE)
。在我的真实数据中,有超过三列,也有超过四行。我想我可以以某种方式计算缺失并将其作为一种规则使用?

我认为单用
colSums
无法做到这一点,但您可以使用
ifelse
将其添加到结果中:

colSums(dfn,na.rm=TRUE) + ifelse(colSums(is.na(dfn)) > 1, NA, 0)
 a  b  c 
 9 NA  4 

@James的答案没有错,但这里有一个稍微简洁的方法:

colSums(apply(dfn, 2, function(col) replace(col, match(NA, col), 0)))
# a  b  c 
# 9 NA  4 

match(NA,col)
返回col中第一个
NA
的索引,
replace
将其替换为
0
并返回新列,
apply
返回包含所有新列的
matrix

效果很好,我没有意识到打开的
+ifelse
。非常感谢@在此上下文中,
ifelse
生成另一个与
colSums
结果大小相同的向量。你只是把两个向量加在一起。我明白了,我一直对R中的函数可以自由组合印象深刻。非常感谢。
colSums(apply(dfn, 2, function(col) replace(col, match(NA, col), 0)))
# a  b  c 
# 9 NA  4