如何在R中使用准引用(Quasiquotation)实现group_by分组汇总?
解决方案
方法1:使用dplyr的across函数(推荐)
across是dplyr专为多列操作设计的函数,完美适配动态列名场景,无需循环,代码简洁高效:
library(dplyr) list_columns <- c("x", "y") df_demo %>% group_by(year) %>% summarise(across(all_of(list_columns), mean), .groups = "drop")
all_of(list_columns)将字符向量转换为dplyr可识别的列引用.groups = "drop"等价于后续的ungroup(),分组后直接取消分组- 自动保留原列名,输出结果与固定列名写法完全一致
方法2:修复原准引用代码
你的循环代码存在两个问题:未保存并合并循环结果,且左侧动态列名的语法有误。以下是修正后的版本:
library(dplyr) library(rlang) list_columns <- c("x", "y") # 初始化结果表,先提取唯一的year值并排序 result <- df_demo %>% distinct(year) %>% arrange(year) for(column_i in list_columns) { column_sym <- sym(column_i) # 计算当前列的分组均值 temp <- df_demo %>% group_by(year) %>% summarise(!!column_sym := mean(!!column_sym), .groups = "drop") # 将当前列的均值合并到结果表 result <- result %>% left_join(temp, by = "year") } result
- 使用
!!column_sym :=是dplyr准引用中动态列名赋值的正确语法 - 每次循环生成单列的均值表,再通过
left_join合并到总结果表,确保所有列的均值在同一表中
方法3:使用data.table原生语法(大数据量更高效)
由于你的数据是data.table类型,直接用其原生语法处理效率更高:
library(data.table) list_columns <- c("x", "y") df_demo[, lapply(.SD, mean), by = year, .SDcols = list_columns]
.SD代表数据子集(Subset of Data),即指定的列集合.SDcols = list_columns明确要计算均值的列lapply(.SD, mean)对指定列逐一应用均值函数by = year按year分组计算
内容的提问来源于stack exchange,提问作者Andrii
相关产品推荐
相关产品推荐

