2014-09-30 7 views
5

Ich habe eine Liste von Datenrahmen, für jede Liste habe ich einen Namen dafür, das ist die USERID, die folgende ist eine Probe der Liste:Wie man eine Liste von Datenrahmen in einen Datenrahmen konvertiert, der eine neue Spalte hat, zeige den Namen der Liste in R

$'AAAAAA' 
AA BB CC 
a b 1 
c d 2 
e f 3 
S'BBBBBB' 
AA BB CC 
g h 1 
i j 2 
k l 3 

Meine Frage ist, wie diese Liste in einen Datenrahmen zu konvertieren, die eine neue Spalte zeigt die Benutzer-ID hat, wie die unter Beispiel:

AA BB CC USERID 
a b 1 AAAAAA 
c d 2 AAAAAA 
e f 3 AAAAAA 
g h 1 BBBBBB 
i j 2 BBBBBB 
k l 3 BBBBBB 

Jede Idee, wie es könnte gemacht werden. Vielen Dank im Voraus

+0

Versuchen Sie 'df <- do.call (rbind, l); df $ USERID <- gsub ("[.] \\ d", "", Zeile.Name (df)) 'wenn' l 'Ihre Liste ist –

+1

Dies wurde schon mehrmals zuvor beantwortet, z. [** hier **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** hier **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** hier ** ] (http://stackoverflow.com/questions/15214472/use-object-names-within-a-list-in-lapple-ldply), [** hier **] (http://stackoverflow.com/questions/25759336/how-to-create-a-new-Spalte-mit-Namen-in-einer-Liste/25759940 # 25759940). – Henrik

Antwort

6

Da cbind seine Argumente an die Länge des längsten Vektor rezykliert, könnten Sie

Reduce(rbind, Map(cbind, x, USERID = names(x))) 
# AA BB CC USERID 
# 1 a b 1 AAAAA 
# 2 c d 2 AAAAA 
# 3 e f 3 AAAAA 
# 4 g h 1 BBBBB 
# 5 i j 2 BBBBB 
# 6 k l 3 BBBBB 

versuchen, wo x ist

structure(list(AAAAA = structure(list(AA = c("a", "c", "e"), 
    BB = c("b", "d", "f"), CC = 1:3), .Names = c("AA", "BB", 
"CC"), class = "data.frame", row.names = c(NA, -3L)), BBBBB = structure(list(
    AA = c("g", "i", "k"), BB = c("h", "j", "l"), CC = 1:3), .Names = c("AA", 
"BB", "CC"), class = "data.frame", row.names = c(NA, -3L))), .Names = c("AAAAA", 
"BBBBB")) 
+0

Super, ja, genau das möchte ich erreichen! Danke, Richard. – SmithWang

+0

@ user3758587 - Ich habe es gerade jetzt geändert. Es ist jetzt besser –

+1

Ich habe dein neues Skript versucht, es funktioniert auch. Vielen Dank für Deine Mühe. Übrigens habe ich auch Davids Methode ausprobiert, data.table ist viel schneller. – SmithWang

4

Oder (wenn l Ihre Liste ist)

library(data.table) 
rbindlist(Map(cbind, l, USERID = names(l))) 
# AA BB CC USERID 
# 1: a b 1 AAAAAA 
# 2: c d 2 AAAAAA 
# 3: e f 3 AAAAAA 
# 4: g h 1 BBBBBB 
# 5: i j 2 BBBBBB 
# 6: k l 3 BBBBBB 
6

Ein anderer Weg, uns in der Entwicklungsversion von tidyr:

# install.packages("devtools") 
devtools::install_github("hadley/tidyr") 
library(tidyr) 

unnest(mylist, USERID) 
# USERID AA BB CC 
# 1 AAAAA a b 1 
# 2 AAAAA c d 2 
# 3 AAAAA e f 3 
# 4 BBBBB g h 1 
# 5 BBBBB i j 2 
# 6 BBBBB k l 3 
+0

Wie kommt es, dass ich in meiner Version von 'tidyr' nicht mehr" unnest "habe? –

+0

Ich kannte diese neue Funktion erst, als ich sie neulich gesehen habe. Sie benötigen die Github-Version. 'nnest()' ist noch nicht offiziell veröffentlicht. https://github.com/hadley/tidyr/blob/master/man/unnest.Rd – jazzurro

+2

@jazzurro +1, es ist besser, das in der Post zu zeigen, um es klar zu machen. Bibliothek ('devtools'); install_github ('hadley/tidyr'); Bibliothek (tidyr) ' – akrun

Verwandte Themen