R语言使用summarise(count = n())统计时如何排除指定列的NA值
问题根源
你之前代码中使用的n()统计的是每个Org_unit分组下的总记录数,不会排除指定问题列的NA值,因此统计Q2时也计入了所有无应答用户。
解决方案
统计指定问题的有效应答人数时,用sum(!is.na(目标问题列))替代n(),同时计算选1占比时给mean()添加na.rm = TRUE参数忽略NA值即可,示例代码如下:
library(dplyr) # Q2的统计逻辑 prop_q2 <- DF %>% group_by(Org_unit) %>% summarise( # 仅统计当前问题的有效应答人数 valid_count = sum(!is.na(Q2)), # 计算占比时跳过NA值,全NA场景会返回NaN,可按需调整为NA或0 prop = mean(Q2 == 1, na.rm = TRUE) )
运行上述代码后,Q2的valid_count会全部返回0,符合你预期的无应答不计入有效统计的要求。
如果需要批量处理多个问题列,可以用across函数一次性生成所有问题的统计结果:
# 同时统计Q1、Q2的有效人数和选1占比 prop_all <- DF %>% group_by(Org_unit) %>% summarise( across(c(Q1, Q2), list( # 有效应答人数 valid_n = ~sum(!is.na(.x)), # 选1的占比 prop_1 = ~mean(.x == 1, na.rm = TRUE) )) )
如果需要将全无效应答场景下返回的NaN调整为NA,可以在计算占比的逻辑后添加替换逻辑:
prop = replace(mean(Q2 == 1, na.rm = TRUE), is.nan(mean(Q2 == 1, na.rm = TRUE)), NA)
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

