2014-09-21 8 views
5

Ho una lista annidata che assomiglia a questo:as.data.frame appiattisce lista annidata in un'unica fila invece di creare riga per ogni record

mylist <- vector("list", 2) 
mylist[[1]]$name <- "The Tucson IOT Meetup Group" 
mylist[[1]]$state <- "AZ" 
mylist[[2]]$name <- "#SFMySQL Meetup" 
mylist[[2]]$state <- "CA" 

mylist 
[[1]] 
[[1]]$name 
[1] "The Tucson IOT Meetup Group" 

[[1]]$state 
[1] "AZ" 


[[2]] 
[[2]]$name 
[1] "#SFMySQL Meetup" 

[[2]]$state 
[1] "CA" 

Mi piacerebbe trasformare questo in un frame di dati con colonne "nome" e "stato" e due righe, una per ogni record. Ma quando provo ad usare as.data.frame per fare questo, torno una singola riga di dati, con le colonne separate per ciascuna delle variabili i record, in questo modo:

myframe <- as.data.frame(mylist) 
myframe 
           name state   name.1 state.1 
1 The Tucson IOT Meetup Group AZ #SFMySQL Meetup  CA 

non sono sicuro cosa sta succedendo. Qual è il modo giusto per farlo?

risposta

4
do.call(rbind.data.frame, mylist) 
##       name state 
## 2 The Tucson IOT Meetup Group AZ 
## 21    #SFMySQL Meetup CA 

La funzione do.call è piuttosto come il (l/s) applicare funzioni e consente funzioni di accumulare risultati delle chiamate successive. La funzione Reduce a volte compie lo stesso risultato:

Reduce(rbind.data.frame, mylist) 
##       name state 
##2 The Tucson IOT Meetup Group AZ 
##21    #SFMySQL Meetup CA 

È possibile anche ottenere rbind di "lavorare" con Reduce:

Reduce(rbind, mylist) 
##  name       state 
##init "The Tucson IOT Meetup Group" "AZ" 
##  "#SFMySQL Meetup"    "CA" 

inizialmente pensato che potrebbe essere il miglior risultato. (Preferisco i risultati che forniscono valori di carattere piuttosto che fattori.) Tuttavia, entrambi gli approcci di Riduzione forniscono strutture piuttosto strane se visualizzati con str().

+0

che funziona sicuramente. Cosa succede? Perché non dovrebbe rbind (mylist) funzionare? – Traviskorte

+1

'mylist' non è un vettore o una matrice quindi' rbind.default' non funziona e non c'è 'rbind.list' –

+0

Il' 'row.names'' risultante è strano (21 in precedenza), ma io supponiamo che questo sia innocuo e, inoltre, possiamo sempre '' NULL''ify them ... – PatrickT

3

Oppure provate data.table s rbindlist funzione (molto efficiente per i grandi insiemi di dati)

library(data.table) 
rbindlist(mylist) 
#       name state 
# 1: The Tucson IOT Meetup Group AZ 
# 2:    #SFMySQL Meetup CA 
Problemi correlati