如何统计dataframe中非零且非NA值的列计数?
问题描述
需要统计数据框每一列中非零且非NA的元素数量,数据中存在NA值,类似统计每列非零元素的需求,但需额外排除NA值。
示例数据
x <- cbind(x1 = NA, x2 = c(4:1), x3 = c(0, NA, 1, NA))
预期结果
[1] 0 4 1
解决方案
方法1:使用colSums(简洁高效)
利用colSums结合逻辑判断,通过na.rm = TRUE忽略NA值:
colSums(x != 0, na.rm = TRUE)
说明:x != 0生成布尔矩阵,NA值会被标记为NA,na.rm = TRUE会忽略这些NA,最终统计每列中TRUE的数量,即非零且非NA的元素数。
方法2:使用apply函数
逐列处理,统计符合条件的元素:
apply(x, 2, function(col) sum(col != 0, na.rm = TRUE))
说明:apply(x, 2, ...)指定对每一列执行自定义函数,函数内部通过sum统计非零且非NA的元素数量。
方法3:使用dplyr包(适配数据框操作)
如果习惯dplyr的管道风格:
library(dplyr) as.data.frame(x) %>% summarise(across(everything(), ~ sum(.x != 0, na.rm = TRUE)))
输出为数据框格式,若需要转为向量,可追加%>% unlist()或%>% pull()。
内容的提问来源于stack exchange,提问作者Sofie Abildgaard
相关产品推荐
相关产品推荐

