data.table:在“by=variable”语句中应用函数时保留原始列名

问题描述 投票:0回答:1

当我想要在

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) ="
r data.table
1个回答
0
投票

对于您编辑的问题,

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
© www.soinside.com 2019 - 2024. All rights reserved.