2017-05-31 45 views
-1

我正在通過循環創建一系列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' 
+2

不要使用'assign'。將所有這些data.tables放在一個列表中。 – Roland

+0

我使用外部循環一次創建表1。爲什麼我應該避免分配? – MidnightDataGeek

+1

由於遇到的種種問題...'assign'適用於知道何時需要(幾乎從不)的專家。使用列表(或環境)是「R方式」。 – Roland

回答

1

我認爲set命令的用法會比較在data.table包的精神並可以完成這項工作。

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

這樣,列名中不會有引號。

雖然你沒有問,但我覺得使用list來保存所有data.tables將會更好地使用R的數據結構。

+0

道歉我應該提到我使用我需要對組進行操作,所以我不認爲'set'在這種情況下會起作用。 我會更新我的問題。 – MidnightDataGeek

+0

也許你可以先做子集操作,然後在中間結果的第二步中使用'set'?在第三步中,您可以使用'set'再次更新原始data.table中的數據。 – mondano

+0

謝謝做中間步驟似乎已經奏效。所以我使用我的原始方法創建列,然後使用set來更新它,它似乎可以解決問題。 看來使用變量在R中是非常艱苦的工作嗎? – MidnightDataGeek