我通过循环创建一系列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'
答案 0 :(得分:1)
我认为使用set
命令更符合data.table
包的精神,可以完成这项工作。
set(x=eval(as.name(tbl)), j=tbl, value=2L)
这样,列名中没有引号。
虽然你没有问,我觉得使用列表来保存所有data.tables可以更好地利用R的数据结构。