You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 03:15:05