R 在data.table中将变量用作列名

R 在data.table中将变量用作列名,r,data.table,R,Data.table,我正在通过一个循环创建一系列data.tables,其中每个表的名称和列都依赖于该循环 我发现我可以使用assign来创建表,然后使用evalas.nametbl来调用它,这似乎可以正常工作。但是,列名的行为似乎与我想要的不太一样 为了生成列名,我使用capture.outputstrtbl,give.head=F,它可以工作,但是当我想要引用列时,它被双引号包围,例如name\u win\u pcnt 我似乎也无法引用该列,因此如果我使用name\u win\u pcnt$name\u win

我正在通过一个循环创建一系列data.tables,其中每个表的名称和列都依赖于该循环

我发现我可以使用assign来创建表,然后使用evalas.nametbl来调用它,这似乎可以正常工作。但是,列名的行为似乎与我想要的不太一样

为了生成列名,我使用capture.outputstrtbl,give.head=F,它可以工作,但是当我想要引用列时,它被双引号包围,例如name\u win\u pcnt

我似乎也无法引用该列,因此如果我使用name\u win\u pcnt$name\u win\u pcnt,则控制台中会出现空值

这里有一个例子

require(data.table)
# initial data table
dt <- data.table(x = rnorm(10),
             y = rnorm(10),
             grp = c(rep("a",3), rep("b",7))))

#variables
metric <- c("win", "place")
cols <- "name"

tbl <- paste0(cols, "_", metric[1],"_pcnt")

# create new table and create new column
assign(tbl, dt, envir = .GlobalEnv)
eval(as.name(tbl))[, capture.output(str(tbl, give.head = F)) := 0L, by = .(grp)]

我认为set命令的使用更符合data.table包的精神,可以完成这项工作

 set(x=eval(as.name(tbl)), j=tbl, value=2L)
这样,列名中就没有引号了


虽然您没有问,但我觉得使用列表将所有数据表放在一起会更好地利用R的数据结构。

不要使用assign。将所有这些data.tables放在一个列表中。我使用外部循环一次创建一个表。为什么我要避免分配?因为你遇到了这样的问题。。。分配给那些知道何时需要它的专家,他们几乎从不知道。使用列表或环境是R的方式。抱歉,我应该提到我使用我需要对组执行操作,所以我认为在这种情况下set不起作用。我将更新我的问题。也许您可以在之前执行子集操作,并在中间结果的第二步中使用set?在第三步中,您可以使用set再次更新原始data.table中的数据。感谢您完成了中间步骤。所以我用我原来的方法创建了这个列,然后用set来更新它,它似乎解决了这个问题。在R中使用变量似乎是相当困难的工作?这是不寻常的,我不经常这样做,但它是可行的,语言可以处理它。如果您的案例符合set,请将我的答案标记为已接受。谢谢
 set(x=eval(as.name(tbl)), j=tbl, value=2L)