如何使用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
相关产品推荐
相关产品推荐

