expss包交叉分类表缺失值处理异常及统计测试工具问询
问题
我用expss包制作市场研究的交叉分类表时,遇到了无效响应(如-999、-998这类缺失值)的处理异常。背景是客户调研中跳过的问题会被记录为-999/-998,这类值需要从百分比、均值计算中排除,但要在表格中保留显示;同时还需合并Likert量表评级(比如将5分制满意度的4+5组合为“Top 2 Box”分组)。
当前问题:使用tab_mis_val标记缺失值后,仅quest1的常规统计排除了缺失值,而quest1 %in% c(4,5)的分组统计未排除该类值,总案例数仍为原始的8和7,未去掉缺失值。需要解决expss中的这个问题,同时想了解有哪些支持加权与未加权统计测试的替代R包。
可复现代码及输出
原始代码(未标记缺失值)
library(tibble) library(expss) df <- tibble( id = 1:15, quest1 = c(1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, -999, -998), grp = c("G1", "G2", "G1", "G2", "G1", "G1", "G2", "G1", "G2", "G1", "G2", "G1", "G2", "G1", "G2")) example1 = df %>% tab_cols(grp) %>% tab_cells(quest1, quest1 %in% c(4, 5)) %>% tab_stat_cpct() %>% tab_pivot()
example1输出:
| | | grp | | | | | G1 | G2 | | ------------------- | ------------ | ---- | ---- | | quest1 | -999 | 12.5 | | | | -998 | | 14.3 | | | 1 | 12.5 | 14.3 | | | 2 | 25.0 | 14.3 | | | 3 | 12.5 | | | | 4 | 12.5 | 28.6 | | | 5 | 25.0 | 28.6 | | | #Total cases | 8.0 | 7.0 | | quest1 %in% c(4, 5) | FALSE | 62.5 | 42.9 | | | TRUE | 37.5 | 57.1 | | | #Total cases | 8.0 | 7.0 |
标记缺失值后的代码
example2 = df %>% tab_cols(grp) %>% tab_cells(quest1, quest1 %in% c(4, 5)) %>% tab_mis_val(c(-999, -998)) %>% ## 排除语句 tab_stat_cpct() %>% tab_pivot()
example2输出:
| | | grp | | | | | G1 | G2 | | ------------------- | ------------ | ---- | ---- | | quest1 | 1 | 14.3 | 16.7 | | | 2 | 28.6 | 16.7 | | | 3 | 14.3 | | | | 4 | 14.3 | 33.3 | | | 5 | 28.6 | 33.3 | | | #Total cases | 7.0 | 6.0 | <- 已排除缺失值 | quest1 %in% c(4, 5) | FALSE | 62.5 | 42.9 | | | TRUE | 37.5 | 57.1 | | | #Total cases | 8.0 | 7.0 | <- 未排除缺失值
解决方案
一、expss中解决缺失值排除问题
问题根源是quest1 %in% c(4,5)是直接基于原始数据生成的逻辑向量,tab_mis_val不会自动关联处理衍生变量中的缺失值,可通过以下两种方法解决:
方法1:先转换无效值为NA,再生成分组变量
先将-999/-998转为NA,衍生分组变量时会自动忽略这些值,同时用tab_mis_val保留显示原始无效值(若不需要展示可省略该语句):
df_processed <- df %>% mutate(quest1 = na_if(quest1, -999), quest1 = na_if(quest1, -998), top2box = quest1 %in% c(4,5)) example3 = df_processed %>% tab_cols(grp) %>% tab_cells(quest1, top2box) %>% tab_mis_val(c(-999, -998)) %>% # 保留原始缺失值编码的显示 tab_stat_cpct() %>% tab_pivot()
输出中top2box的总案例数会和quest1一致,已排除缺失值。
方法2:在tab_cells中直接过滤缺失值
在分组逻辑中主动排除无效值,确保统计仅计算有效响应:
example4 = df %>% tab_cols(grp) %>% tab_cells(quest1, if_else(quest1 %in% c(-999, -998), NA, quest1 %in% c(4,5))) %>% tab_mis_val(c(-999, -998)) %>% tab_stat_cpct() %>% tab_pivot()
此方法会让quest1 %in% c(4,5)的统计自动排除-999/-998,总案例数与quest1保持一致。
二、支持加权/未加权统计测试的替代R包
1. survey包
专门处理复杂抽样调查,支持加权统计、卡方检验、回归等,适配市场研究中的加权样本分析。
- 核心函数:
svytable()生成交叉表,svychisq()执行加权卡方检验,svymean()计算加权均值。
2. tables包
灵活生成各类统计表格,支持分组、加权、自定义统计量,语法贴近传统统计软件。
- 核心函数:
tabular()构建表格,可结合weights()处理加权数据。
3. gtsummary包
专注生成美观的统计摘要表,支持加权、卡方检验、t检验,输出可直接用于报告。
- 核心函数:
tbl_summary()、tbl_cross()生成交叉表,add_p()添加统计检验p值,modify_weight()设置权重。
4. janitor包
简化数据清理与交叉表生成,支持加权百分比,配合dplyr使用便捷。
- 核心函数:
tabyl()生成基础交叉表,adorn_percentages()添加百分比,adorn_pct_formatting()格式化显示。
内容的提问来源于stack exchange,提问作者sspera

