2014-09-30 18 views
5

Ho una lista di frame di dati, per ogni elenco, ho un nome per esso, che è l'USERID, il seguente è un campione della lista:Come convertire l'elenco di dataframe in dataframe che ha una nuova colonna mostra il nome dell'elenco 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 

la mia domanda è come convertire questa lista in una cornice di dati che ha una nuova colonna che mostra l'USERID, come l'esempio riportato di seguito:

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 

Qualsiasi idea di come sia potrebbe essere fatto. Grazie mille in anticipo

+0

Provare 'df <- do.call (rbind, l); df $ USERID <- gsub ("[.] \\ d", "", row.names (df)) 'se' l' è la tua lista –

+1

Questa risposta ha avuto risposta diverse volte, ad es. [** qui **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** qui **] (http://stackoverflow.com/questions/15162197/append-data-sets-create-new-column-identifying-which-data-set-it-came-from), [** qui ** ] (http://stackoverflow.com/questions/15214472/use-object-names-within-a-list-in-lapply-ldply), [** qui **] (http://stackoverflow.com/questions/25759336/how-to-create-a-new-colonna-con-nomi-in-a-list/25759940 # 25759940). – Henrik

risposta

6

Dal cbind ricicla i suoi argomenti alla lunghezza della più lunga vettore, si potrebbe provare

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 

dove x è

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

Fantastico, sì, questo è esattamente ciò che voglio ottenere! Grazie, Richard. – SmithWang

+0

@ user3758587 - In realtà l'ho cambiato proprio ora. È meglio ora –

+1

Ho provato il tuo nuovo script, funziona pure. Grazie mille per il tuo impegno. A proposito, ho anche provato il metodo di David, data.table è molto più veloce. – SmithWang

4

o (se l è la vostra lista)

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

Un altro modo, noi la versione di sviluppo di 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

Come mai non ho 'unnest' nella mia versione 0.1 di' tidyr'? –

+0

Non conoscevo questa nuova funzione fino a quando l'ho visto l'altro giorno. Devi ottenere la versione github. 'unnest()' non è ancora stato rilasciato ufficialmente. https://github.com/hadley/tidyr/blob/master/man/unnest.Rd – jazzurro

+2

@jazzurro +1, è meglio mostrarlo nel post per chiarire. 'biblioteca (''); devtools install_github ('Hadley/tidyr'); libreria (tidyr) ' – akrun