在R的data.table中聚合时动态命名聚合变量的可行性咨询
在data.table中动态命名聚合变量
没问题!在data.table里完全可以通过动态字符串或向量直接给聚合变量命名,不用先聚合完再手动重命名——刚好匹配你的需求。咱们结合你提供的DT数据来一步步演示:
首先先还原你的测试数据:
library(data.table) DT <- data.table( var1 = c(1, 3, 2, 1, 0), var2 = c(1, 0, 2, 0, 2), var3 = c("A", "A", "B", "A", "C") )
1. 单个动态命名的聚合变量
如果你有一个存储了目标名称的字符串变量,比如想把var1的求和结果命名为sum_var1,可以用!!(bang-bang)操作符来解析这个字符串:
# 定义动态名称 new_col_name <- "sum_var1" # 聚合时直接使用动态命名 DT[, .(!!new_col_name = sum(var1)), by = var3]
执行后输出:
var3 sum_var1
1: A 5
2: B 2
3: C 0
2. 多个动态命名的聚合变量
如果需要同时给多个聚合结果设置动态名称,比如要计算var1的和、var2的均值,对应的名称存在向量里,可以用setNames来给聚合结果的列表元素命名:
# 定义多个动态名称 new_col_names <- c("total_var1", "avg_var2") # 聚合+动态命名一步完成 DT[, setNames(list(sum(var1), mean(var2)), new_col_names), by = var3]
执行后输出:
var3 total_var1 avg_var2
1: A 5 0.3333333
2: B 2 2.0000000
3: C 0 2.0000000
另外如果你习惯用rlang包的语法,也可以用syms把字符串向量转换成符号,再配合!!来实现:
library(rlang) new_col_syms <- syms(new_col_names) DT[, .( !!new_col_syms[[1]] = sum(var1), !!new_col_syms[[2]] = mean(var2) ), by = var3]
关键说明
这种方式是在聚合过程中直接完成命名,和你提到的“先聚合再重命名”完全不同,完美满足你通过动态引用设置聚合变量名的需求。data.table的非标准计算(NSE)特性让这种动态操作非常灵活。
内容的提问来源于stack exchange,提问作者Ankhnesmerira
相关产品推荐
相关产品推荐

