2015-08-17 14 views
10

Ich habe eine Liste von benannten Listen der folgenden Form aus einem JSON-Objekt:Liste benannter Listen data.frame

my_list = list(list(a = 10, b = "blah"), 
       list(a = 15, b = "stuff")) 

Jedes Element der äußeren Liste ist eine benannte Liste und ich möchte es konvertieren zu einem data.frame der mit den Spaltennamen folgende Formular intakt:

a b 
10 "blah" 
15 "stuff" 

auf der Oberfläche, kann ich das erreichen to_df = data.frame(do.call(rbind, my_list)) by doing.

Wenn ich jedoch eine individuelle Spalte to_df$a oder to_df[,1] zu extrahieren, um zu versuchen wäre, würde ich eine Liste anstelle eines Vektors erhalten, wie sie normalerweise von einem data.frame erwartet:

> to_df[,1] 
[[1]] 
[1] 10 

[[2]] 
[1] 15 

Statt:

> to_df[,1] 
[1] 10 15 

Ein alter Eintrag auf der R-Mailingliste schlug die folgende Lösung vor: to_df = as.data.frame(t(sapply(my_list, rbind))). Dies wird jedoch nicht nur nicht über die Spaltennamen übertragen, sondern es besteht immer noch das Problem, dass bei der Betrachtung einzelner Spalten mit to_df[,1] eine Liste anstelle eines Vektors zurückgegeben wird.

Was ist der beste Weg, dies zu erreichen? Gibt es einen dplyr Weg?

EDIT: Vielen Dank für alle Lösungen, wie es scheint der Trick zu lapply ist und verwandeln jedes Element der Liste zu einem data.frame und sie dann zusammenzubinden dplyr oder do.call verwenden. Alternativ funktioniert die meiste Arbeit mit einem einzigen Anruf zu rbindlist.

+4

Sie könnten versuchen, 'lapply (my_list, data.frame)%>% bind_rows()' –

+1

Sie haben mehrere tragfähige Lösungen unten. Sie sollten jedoch beachten, dass 'to_df = data.frame (do.call (rbind, my_list))' nicht den Eindruck eines 'dat.frame' erweckt. Es scheint, Ihnen eine "Liste" zu geben, die auf der Ausgabe basiert, die Sie zeigen. –

Antwort

10

Ich bevorzuge rbindlist aus der data.table Paket. Es ist einfach, schnell und gibt einen Datenrahmen/eine Tabelle zurück.

data.table::rbindlist(my_list) 
#  a  b 
# 1: 10 blah 
# 2: 15 stuff 

Ein weiterer Vorteil von rbindlist() ist, dass es automatisch in fehlenden Werten mit NA füllen.

die data.table Klasse zu entfernen, können Sie in as.data.frame()

as.data.frame(data.table::rbindlist(my_list)) 
6

In Basis R wickeln nur können Sie tun

df<-do.call(rbind,lapply(my_list,data.frame)) 
5

Es sieht aus wie Sie dies mit bind_rows aus der Entwicklungsversion tun können dplyr, dplyr_0.4.2.9002, wie vor zwei Tagen.

library(dplyr) 
bind_rows(my_list) 

Source: local data frame [2 x 2] 

    a  b 
1 10 blah 
2 15 stuff