如何为非迭代生成的tidyverse汇总表添加组间差值列
优化方案
核心逻辑是延后字符串拼接步骤,先完成所有数值型统计量的计算,再做格式处理,避免反复解析字符串带来的冗余代码。
完整实现代码如下:
library(tidyverse) sum_variables <- c("mpg", "hp", "disp") # 生成分组变量 mtcars <- mtcars %>% mutate(am_factor = case_when(am == 0 ~ "Automatic", TRUE ~ "Manual")) # 一次性完成统计、差值计算与格式输出 mtcars %>% group_by(am_factor) %>% # 先计算每个变量的均值、标准差数值,暂不拼接 summarise(across(all_of(sum_variables), list(mean = ~round(mean(.), 2), sd = ~round(sd(.), 2)), .names = "{.col}_{.fn}")) %>% # 转长格式拆分变量名与统计类型 pivot_longer(cols = -am_factor, names_to = c("name", ".value"), names_sep = "_") %>% # 把分组类型展开为列 pivot_wider(names_from = am_factor, values_from = c(mean, sd)) %>% # 直接用数值计算差值,再拼接显示用的字符串 mutate(difference = round(mean_Automatic - mean_Manual), Automatic = paste0(mean_Automatic, "(±", sd_Automatic, ")"), Manual = paste0(mean_Manual, "(±", sd_Manual, ")")) %>% # 选择最终需要的列 select(name, Automatic, Manual, difference)
运行结果和需求完全匹配:
# A tibble: 3 × 4 name Automatic Manual difference <chr> <chr> <chr> <dbl> 1 mpg 17.15(±3.83) 24.39(±6.17) -7 2 hp 160.26(±53.91) 126.85(±84.06) 33 3 disp 290.38(±110.17) 143.53(±87.2) 147
该方案的优势:
- 全程无迭代逻辑,全部使用tidyverse原生向量化操作
- 所有数值统计量都保留在中间步骤,后续需要新增列(比如差异显著性、变异系数等)不需要重新计算或解析字符串
- 逻辑分层清晰,统计计算和展示格式分离,更易维护
内容的提问来源于stack exchange,提问作者Serkan
相关产品推荐
相关产品推荐

