2017-02-15 2 views
0

Ich habe Daten wie folgt aus:Wie erstelle ich eine data.table, indem ich programmatisch benannte Vektoren kombiniere?

number_of_runs <- 4 
r1 <- c(1,2,3) 
r2 <- c(4,5,6) 
r3 <- c(7,8,9) 
r4 <- c(10,11,12) 

Ich habe regelmäßig Zahlen von Läufen unterschiedlichen (gespeichert als drei Zahlen in einem Vektor namens r1 für den ersten Lauf, r2 für die zweite Lauf, etc.). Ich möchte diese Vektoren in eine data.table kombinieren, aber da die Anzahl der Läufe variiert, muss ich dies programmatisch tun.

arbeitet Below perfekt für eine festgelegte Anzahl von Durchläufen Ausgeben dt genau so, wie ich es brauche:

dt <- data.table(r1,r2,r3,r4) 

Ich brauche etwas ähnliches wie dies unter, aber das funktioniert tatsächlich:

dt <- data.table(c(paste0("r", 1:number_of_runs))) 

Also, wenn es gibt 3 Läufe, es wird eine data.table wie data.table(r1,r2,r3) ausgegeben und wenn es 4 Läufe gibt, wird es eine data.table wie data.table(r1,r2,r3,r4) und so weiter ausgeben.

Ich verwende data.table Version 1.10.4 auf einem Windows 7-Rechner. Ich schätze Ihre Ideen dazu.

+4

Woher kamen die 4 'r *' Vektoren? Das Erstellen verschiedener Variablen mit verwandten Informationen ist nicht der beste Weg, um Dinge zu tun. Diese sollten sich wahrscheinlich in einer Liste befinden, die die Arbeit viel einfacher macht. Aber das Problem, das Sie haben, ist, dass Sie Symbole (Dinge ohne Anführungszeichen) nicht mit Zeichenwerten ersetzen können (was 'paste0()' zurückgibt). – MrFlick

+0

@MrFlick Ich bin nicht verheiratet mit Vektoren für die 4 'r *'. Wie würden Sie vorschlagen, die 4 'r *' in einer Liste zu erstellen, um dieses Problem zu lösen? Vielen Dank. – FG7

+1

Nun, wie hast du sie überhaupt erschaffen? Hast du 4 Mal eine Funktion ausgeführt? Etwas wie "r <- replicate (4, roll())" könnte funktionieren. Oder einfach nur diese Werte wörtlich verwenden, "r <- liste (c (1,2,3), c (4,5,6), c (7,8,9), c (10,11,12))" . Dann können Sie sie mit 'r [[1]]', 'r [[2]]', usw. erhalten und 'do.call (" data.table ", r)' verwenden, um sie in Daten zu speichern. Tabelle. – MrFlick

Antwort

1

Wie @MrFlick bemerkte, wäre es viel einfacher, wenn die r* Vektoren in einem besseren Format gespeichert wurden. Zum Beispiel könnten sie direkt in eine data.table gelegt werden. Oder wenn sie in einer Liste mit dem Namen say rList wären, dann wäre Ihre Antwort einfach as.data.table(rList). Sie müssen also wirklich neu bewerten, wie Sie diese Variablen erstellt haben. Bitte teilen Sie diesen Code mit uns!

Der Vollständigkeit halber jedoch gibt es eine Möglichkeit, genau das zu tun, was Sie gefragt haben: Sie beginnen mit einem Zeichenvektor von Variablen und kombinieren die Variablen mit diesen Namen in der aktuellen Umgebung in data.table.

library(data.table) 
# say we must start with these vectors flaoting around the global environment 
r1 <- c(1,2,3) 
r2 <- c(4,5,6) 
r3 <- c(7,8,9) 
r4 <- c(10,11,12) 
number_of_runs <- 4 

# collect their names in a character vector as you have done: 
rNames <- paste0("r", 1:number_of_runs) 
# collapse them into one string 
rNamesCollapsed <- paste(rNames, collapse = ", ") 
# form the command we need to switch to create the data.table, still as a character vector: 
commandString <- paste0("data.table(", rNamesCollapsed , ")") 
# parse the character vector command into an R expression: 
commandExpr <- parse(text = commandString) 
# evaluate the expression to get the data.table: 
dt <- eval(commandExpr) 

ich nicht reccommend Sie auf diese Weise vorgehen, ich wollte nur dieses Beispiel schließen Sie den Unterschied zwischen Ausdrücken und Zeichenvektoren schätzen zu helfen, und damit, warum Ihr Ansatz nicht funktioniert hat.

Offensichtlich kann der ganze Code gekürzt werden, aber ich wollte etwas kaputt machen, was vor sich ging. Wie @Roland vorgeschlagen hat, ist ein kürzerer und besserer Weg die Verwendung von mget, die direkt nach Variablen mit Vornamen sucht und sie in einer entsprechend benannten Liste zurückgibt.

# collect their names in a character vector as you have done: 
rNames <- paste0("r", 1:number_of_runs) 
# search the environment for objects with those names, and put them into a list: 
rList <- mget(rNames) 
# convert the list to a data.table: 
dt <- as.data.table(rList) 
+0

Downvoting für die Auswertung geparsten Textes. Wenn Sie solche Vektoren haben, verwenden Sie mget, um sie in einer Liste zu sammeln und von dort fortzufahren. – Roland

+0

Ich wurde für die Beantwortung der gestellten Frage abgelehnt. – mb7744

+0

Ich sehe nicht, wo sie nach Text suchen und Sie sollten es nicht vorschlagen. – Roland

Verwandte Themen