如何在data.table中用字符变量指定新计算列的列名?
解决方法:用字符变量指定新data.table的列名
没问题,这事儿有几种简单的解决办法,完全符合你要创建新data.table并指定列名的需求,不用修改原表x:
方法1:用setNames给结果列表重命名
这是最直观的方式,先计算聚合结果,再用setNames把字符变量的值设为列名:
library(data.table) x <- setDT(copy(mtcars)) colName <- 'mpg' # 写法如下 x[, setNames(list(mean(mpg)), colName), keyby = cyl]
原理:list(mean(mpg))生成一个无命名的结果列表,setNames把colName的字符值作为这个列表的名字,最终输出的data.table就会用这个名字作为列名。
方法2:用!!(bang-bang)操作符实现非标准求值
这是data.table里更简洁的写法,利用!!把字符变量解析成列名符号,直接在.()里指定:
x[, .(!!colName := mean(mpg)), keyby = cyl]
原理:!!会把colName中存储的字符值(也就是"mpg")转换成data.table能识别的列名符号,这样就相当于直接写.("mpg" = mean(mpg)),但这里用变量动态指定了列名。
方法3:手动构造命名列表
如果你想更清晰地拆分步骤,也可以先计算结果,再手动构造命名列表:
x[, { avg_mpg <- mean(mpg) list(!!colName := avg_mpg) }, keyby = cyl]
这种写法和方法2本质一样,只是把计算步骤单独拎出来,可读性更强,适合复杂的计算场景。
需要注意的是,这几种方法都不会修改原表x,都是直接返回一个新的data.table,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ameya
相关产品推荐
相关产品推荐

