当我想要在
data.table
内的一列或多列上执行函数,同时修改我在同一调用中使用函数分组的列时,生成的 data.table
始终将应用的函数显示为新列名称。
代码示例:
library(data.table)
dt <- data.table(value=rnorm(100), class=sample(1:3, 100, replace=TRUE))
dt[, .(class_mean=mean(value)), by=factor(class)]
输出:
factor class_mean
1: 2 0.007297291
2: 3 -0.122847460
3: 1 0.103293676
我最初期望的是在结果中得到原始列名称,如下所示:
class class_mean
1: 2 0.007297291
2: 3 -0.122847460
3: 1 0.103293676
据我判断,无论哪个函数应用于分组列,都会发生这种情况。当对
data.table
执行分组修改并将列名称存储在另一个变量中时,我通常使用 by=get(variable_that_stores_the_column_name)
,也会导致修改后的 data.table
显示 get
作为新列名称。
如何修改我的
data.table
分组调用以获得我想要的结果,而无需再次繁琐地重命名结果的列名称?
感谢评论中的回复和解答。这适用于大多数情况。但是,如果我想通过另一个变量按名称来寻址分组变量(并希望在结果中保留该变量名称),则会出现同样的问题:
var_name <- "class"
dt[, .(class_mean=mean(value)), by=.(var_name = factor(get(var_name)))]
将结果列命名为
var_name
。还有
var_name <- "class"
dt[, .(class_mean=mean(value)), by=.(get(var_name) = factor(get(var_name)))]
导致错误:
Error: unexpected '=' in "dt[, .(class_mean=mean(value)), by=.(get(var_name) ="
对于您编辑的问题,
my_name <- "class"
dt[, .(class_mean=mean(value)), by=.(var_name = factor(var_name)), env = list(var_name = my_name)]
产生所需的输出
class class_mean
<fctr> <num>
1: 2 -0.07004949
2: 1 -0.10250014
3: 3 -0.09003567