2014-09-21 6 views
5

mam zagnieżdżonej listy, która wygląda tak:as.data.frame spłaszcza zagnieżdżone listy w jednym rzędzie zamiast tworzenia wiersza dla każdego rekordu

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" 

Chciałbym przekształcić ramki danych z kolumny "nazwa" i "stan" oraz dwa wiersze, po jednym dla każdego rekordu. Ale gdy próbuję użyć as.data.frame to zrobić, wrócę jeden wiersz danych z oddzielnych kolumnach dla każdego zmiennych rekordy, tak:

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

nie jestem pewien co się dzieje. Jak to zrobić?

Odpowiedz

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

Funkcja do.call jest nieco podobny do (l/s) w funkcji oraz umożliwia zastosowanie funkcji gromadzić wyniki kolejnych połączeń. Funkcja Reduce czasami daje ten sam wynik:

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

Można nawet dostać rbind do „pracy” z Reduce:

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

Początkowo myślał, że może być to najlepszy wynik. (Preferuję wyniki, które dostarczają wartości postaci, a nie czynniki.) Jednak obie metody redukują dostarczają raczej dziwnych struktur, gdy są oglądane za pomocą funkcji str().

+0

To na pewno działa. Co robisz? Dlaczego rbind (mylist) nie działa? – Traviskorte

+1

'mylist' nie jest wektorem ani macierzą, więc' rbind.default' nie działa i nie ma 'rbind.list' –

+0

Wynikowe' 'row.names'' są dziwne (21 w powyższym), ale ja załóżmy, że jest to nieszkodliwe i, co więcej, zawsze możemy "NULL" określić je ... – PatrickT

3

Lub spróbuj data.table s rbindlist funkcji (bardzo wydajne dla dużych zbiorów danych)

library(data.table) 
rbindlist(mylist) 
#       name state 
# 1: The Tucson IOT Meetup Group AZ 
# 2:    #SFMySQL Meetup CA 
Powiązane problemy