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

如何使用across函数重写R dplyr分组统计代码得到相同计算结果

R代码across函数适配方案

原有代码错误点

  • 分组逻辑错误:group_by(across(all_of(tests0, GROUP)))写法不符合规范,all_of()要求传入字符格式的列名向量,普通分组直接写列名即可
  • 统计逻辑拆分错误:对score0/score7单独计算均值、标准误属于单列统计,可以用across遍历实现,但配对t检验需要同时调用两个列的数据,不能放在针对单个列遍历的across逻辑内
  • 语法错误:原有代码括号不匹配,配对t检验未指定paired = TRUE参数和y列,无法得到正确的差值与p值

正确可运行代码

library(dplyr)
library(plotrix) # std.error函数来源于该包
library(stringr)

out %>% 
  group_by(tests0, GROUP) %>% 
  summarise(
    # 遍历两个score列计算均值、标准误,直接生成匹配的列名
    across(c(score0, score7),
           list(mean = ~mean(.x, na.rm = T),
                stderr = ~std.error(.x, na.rm = T)),
           .names = "{.fn}{str_remove(.col, 'score')}"),
    # 单独计算配对t检验结果
    diff.std.mean = t.test(score0, score7, paired = T)$estimate,
    p.value = t.test(score0, score7, paired = T)$p.value,
    .groups = "drop"
  )

如果不想加载额外包处理列名,也可以计算完成后手动重命名:

out %>% 
  group_by(tests0, GROUP) %>% 
  summarise(
    across(starts_with("score"),
           list(mean = ~mean(.x, na.rm = T),
                stderr = ~std.error(.x, na.rm = T))),
    diff.std.mean = t.test(score0, score7, paired = T)$estimate,
    p.value = t.test(score0, score7, paired = T)$p.value,
    .groups = "drop"
  ) %>% 
  rename(mean0 = score0_mean,
         stderr0 = score0_stderr,
         mean7 = score7_mean,
         stederr7 = score7_stderr)

注:上述两种写法运行后的输出结果和你最初的实现完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:24:05