在data.table中使用变量作为列名

时间:2017-05-31 08:49:18

标签: r data.table

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

我发现我可以使用assign创建表格,然后使用eval(as.name(tbl))然后调用它,这似乎可以正常工作。列名似乎没有像我想要的那样表现?

要生成列名,我使用capture.output(str(tbl, give.head = F)),但是当我想引用列时,它被双引号包围,例如"name_win_pcnt"

我似乎无法引用该列,所以如果我使用name_win_pcnt $“name_win_pcnt”,我在控制台中得到一个NULL。

这是一个例子。

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)]

如果我现在尝试使用

更新新列

eval(as.name(tbl))[, eval(tbl) := 1L, by = .(grp)]这会为我创建一个新列但是留下旧列?

我尝试使用eval(as.name(tbl))[, eval(tbl) := 0L]添加列,但是当我尝试更新它时出现错误:

Error in is.nan(name_win_pcnt) : 
  default method not implemented for type 'list'

1 个答案:

答案 0 :(得分:1)

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

 set(x=eval(as.name(tbl)), j=tbl, value=2L)

这样,列名中没有引号。

虽然你没有问,我觉得使用列表来保存所有data.tables可以更好地利用R的数据结构。