我正在通過循環創建一系列data.tables,其中每個表名稱和列都依賴於循環。使用變量作爲data.table中的列名稱
我發現我可以使用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'
不要使用'assign'。將所有這些data.tables放在一個列表中。 – Roland
我使用外部循環一次創建表1。爲什麼我應該避免分配? – MidnightDataGeek
由於遇到的種種問題...'assign'適用於知道何時需要(幾乎從不)的專家。使用列表(或環境)是「R方式」。 – Roland