R语言janitor包tabyl生成列联表时如何抑制缺失值并调整百分比分母
janitor 包
tabyl 函数排除 NA 参与百分比计算的实现方法 核心原因
默认情况下tabyl会将交叉变量的缺失值作为独立类别纳入列联表结构,同时将缺失值计数计入行/列的总和作为百分比计算的分母。如果在带缺失值的表生成完成后再手动删除 NA 对应的行/列,已经算好的百分比不会重新计算,最终结果会和预期的有效样本占比出现偏差。
可落地实现方案
方案1:源头过滤有效交叉样本
直接从原始数据中剔除参与交叉分析的变量缺失行,再生成列联表,计算逻辑清晰可控,是正式分析中的推荐写法:
library(dplyr) library(janitor) library(tidyr) df <- data.frame( col1 = c(1,1,2,2,1, NA,NA), col2 = c("this", NA,"is", "text",NA,NA,'yes'), col3 = c('TRUE', 'FALSE', NA, 'TRUE','TRUE', 'TRUE', 'FALSE'), col4 = c(2.5, 4.2, 3.2, NA, 4.2, 3.2,3) ) %>% mutate_if(is.numeric, as.factor) %>% mutate_if(is.character, as.factor) df %>% # 核心改动:剔除col1、col3存在缺失值的行 drop_na(col1, col3) %>% tabyl(col1, col3) %>% adorn_percentages("row") %>% adorn_pct_formatting(digits = 2) %>% adorn_ns()
运行后输出完全匹配预期结果,无任何 NA 相关行列,百分比分母为对应分组下的有效非缺失样本量。
方案2:用内置参数控制缺失值展示
如果不想提前改动原始数据集,可直接调整tabyl的函数参数实现:
df %>% # 核心改动:关闭NA作为独立类别的展示 tabyl(col1, col3, show_na = FALSE) %>% adorn_percentages("row") %>% adorn_pct_formatting(digits = 2) %>% adorn_ns()
注意:原代码中使用的
show_missing_levels = FALSE是用来控制因子空水平的展示逻辑,和缺失值处理无关,不要和控制缺失值行为的show_na参数混淆。
常见踩坑点
不要在默认生成的带 NA 的列联表基础上,先算完成分比再手动删除 NA 对应的行/列。这种操作下百分比的分母已经在adorn_percentages步骤中用包含 NA 的总计数计算完成,删列只会去掉 NA 对应的占比项,剩下的非 NA 占比依然基于错误的分母,和实际有效样本的占比会有明显偏差。
内容的提问来源于stack exchange,提问作者NewBee
相关产品推荐
相关产品推荐

