请求更新含缺失值的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
相关产品推荐
相关产品推荐

