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

请求更新含缺失值的dplyr交叉表代码(原函数已废弃)

更新后的dplyr缺失值交叉表可运行代码

原代码中使用的mutate_each、funs、spread等函数已在新版dplyr中废弃,以下是适配最新tidyverse语法的替代方案,同时保留对缺失值的处理(匹配Stata交叉表的需求):

1. 基础依赖与示例数据

# 加载tidyverse包(包含dplyr、tidyr等核心工具)
library(tidyverse)

# 模拟带缺失值的数据集(类似Stata常见数据结构)
set.seed(123)
df <- tibble(
  group = sample(c("A", "B", NA), 100, replace = TRUE),
  outcome = sample(c("Yes", "No", NA), 100, replace = TRUE)
)

2. 手动构建交叉表(频数+行百分比)

替代原代码中spread+mutate_each的逻辑,使用pivot_wider和across:

cross_tab <- df %>%
  # 统计所有组合的频数(包括缺失值,.drop=FALSE保留所有水平)
  count(group, outcome, .drop = FALSE) %>%
  # 按组计算行百分比
  group_by(group) %>%
  mutate(row_pct = round(n / sum(n) * 100, 1)) %>%
  ungroup() %>%
  # 转宽格式(替代旧的spread函数)
  pivot_wider(
    names_from = outcome,
    values_from = c(n, row_pct),
    values_fill = list(n = 0, row_pct = 0)  # 缺失的组合填充0
  )

# 查看结果
cross_tab

3. 更接近Stata tabulate的简洁方案(用janitor包)

如果需要快速生成类似Stata的交叉表格式,推荐使用janitor包的tabyl函数:

# 安装并加载janitor包
# install.packages("janitor")
library(janitor)

df %>%
  tabyl(group, outcome, show_missing_levels = TRUE) %>%  # 保留缺失值水平
  adorn_percentages("row") %>%  # 计算行百分比
  adorn_pct_formatting(digits = 1) %>%  # 百分比格式(保留1位小数)
  adorn_ns()  # 同时显示频数和百分比

关键函数替换说明

  • mutate_each(funs(...)) → across(列名, 函数):用于批量处理多列,例如mutate(across(c(group, outcome), as.factor))替代原类型转换逻辑
  • funs() → 直接使用匿名函数或命名列表:例如原funs(mean, sum)替换为list(mean = mean, sum = sum)
  • spread(key, value) → pivot_wider(names_from = key, values_from = value):更灵活的宽格式转换,支持多值列处理

内容的提问来源于stack exchange,提问作者karmakameleon888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:45:37