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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:04