如何在data.table的j列中使用变量指定聚合结果的列名?
在data.table中用变量指定聚合列名
这个问题我之前也碰到过,data.table其实内置了便捷的方法来实现,完全不需要事后再手动重命名列名,下面给你两种常用的解决方案:
方法1:使用准引用(推荐)
data.table支持**准引用(quasiquotation)**语法,通过!!(双感叹号)来解引用变量,直接把变量中的字符串作为列名:
首先初始化数据和变量:
library(data.table) x = data.table(c(1,2,3,4,5,6),c(2,2,2,3,3,3)) varname = "a"
然后执行聚合操作:
x[, .(!!varname := mean(V1), b = max(V1)), by = V2]
执行后得到的输出和你预期的完全一致:
V2 a b 1: 2 2 3 2: 3 5 6
!!的作用是把varname变量的值(也就是字符串"a")替换到表达式中,相当于直接写a := mean(V1),这样生成的列名就是变量存储的内容,而不是变量名本身。
如果有多个变量名需要替换,还可以用!!!(三感叹号)来解引用一个字符向量:
col_names = c("avg_v1", "max_v1") x[, .(!!!setNames(list(mean(V1), max(V1)), col_names)), by = V2]
方法2:使用setNames构造命名列表
如果你习惯更传统的列表操作方式,可以用setNames给聚合结果的列表指定列名:
x[, setNames(list(mean(V1), max(V1)), c(varname, "b")), by = V2]
这种方法也能得到完全相同的输出,原理是先创建包含聚合结果的列表,再用setNames把变量和固定字符串作为列名赋值给列表。
补充说明
如果你使用的是较旧版本的data.table(v1.10.0之前),准引用语法可能不支持,这时可以用eval(as.name(varname))的方式,但现在推荐使用准引用,语法更简洁直观。
内容的提问来源于stack exchange,提问作者Allen Wang
相关产品推荐
相关产品推荐

