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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:20:53