Ich erstelle eine Reihe von data.tables über eine Schleife, wo jeder Tabellenname und Spalten von der Schleife abhängig sind.Verwendung von Variable als Spaltenname in data.table
Ich fand, dass ich assign
verwenden kann, um die Tabelle zu erstellen und dann eval(as.name(tbl))
zu verwenden, um es dann aufzurufen, das zu funktionieren scheint ok. Der Spaltenname scheint sich nicht so zu verhalten, wie ich es möchte.
Um den Spaltennamen zu generieren, verwende ich capture.output(str(tbl, give.head = F))
, die funktioniert, aber wenn ich dann auf die Spalte verweisen möchte, wird sie von doppelten Anführungszeichen umgeben, z. "name_win_pcnt"
Ich kann nicht scheinen, um die Spalte entweder so zu verweisen, wenn ich name_win_pcnt $ "name_win_pcnt" verwende, bekomme ich eine NULL in der Konsole.
Hier ist ein Beispiel.
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)]
Wenn ich jetzt versuchen, die neue Spalte
eval(as.name(tbl))[, eval(tbl) := 1L, by = .(grp)]
das schafft mir eine neue Spalte aktualisieren läßt aber die alten?
Ich habe versucht, die Spalte eval(as.name(tbl))[, eval(tbl) := 0L]
Zugabe aber dann, wenn ich versuche, und aktualisieren Sie es ich erhalte eine Fehlermeldung:
Error in is.nan(name_win_pcnt) :
default method not implemented for type 'list'
Verwenden Sie nicht 'assign'. Legen Sie alle diese data.tables in eine Liste. – Roland
Ich erstelle die Tabellen 1 auf einmal mit meiner äußeren Schleife. Warum sollte ich vermeiden zuweisen? – MidnightDataGeek
Wegen der Art von Problemen, denen Sie begegnen ... "Zuweisen" ist für Experten, die wissen, wann es benötigt wird (fast nie). Verwenden einer Liste (oder Umgebung) ist der "R-Weg". – Roland