2017-05-31 6 views
-1

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' 
+2

Verwenden Sie nicht 'assign'. Legen Sie alle diese data.tables in eine Liste. – Roland

+0

Ich erstelle die Tabellen 1 auf einmal mit meiner äußeren Schleife. Warum sollte ich vermeiden zuweisen? – MidnightDataGeek

+1

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

Antwort

1

Ich denke, dass die Nutzung des set Befehl im Geiste mehr der data.table Paket wäre und kann den Job machen.

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

Auf diese Weise sind keine Anführungszeichen im Spaltennamen.

Obwohl Sie nicht gefragt haben, glaube ich, dass die Verwendung von Listen, die alle data.tables zusammenhalten, die Datenstrukturen von R besser nutzen würde.

+0

Entschuldigung, ich hätte erwähnen sollen, dass ich verwende Ich muss Operationen an Gruppen durchführen, also glaube ich nicht, dass "set" in diesem Fall funktioniert. Ich werde meine Frage aktualisieren. – MidnightDataGeek

+0

vielleicht können Sie die Subset-Operation vor und verwenden 'set' in einem zweiten Schritt auf ein Zwischenergebnis? In einem dritten Schritt könnten Sie die Daten in der ursprünglichen data.table erneut mit 'set' aktualisieren. – mondano

+0

Danke, dass der Zwischenschritt funktioniert hat. Also erstelle ich die Spalte mit meiner ursprünglichen Methode und verwende dann set, um sie zu aktualisieren, und es scheint das Problem zu lösen. Es scheint, dass die Verwendung von Variablen ziemlich harte Arbeit in R ist? – MidnightDataGeek

Verwandte Themen