spłaszcz listę / obiekt oparty na rekordach w ramce danych

Edytuj: to pytanie jest nieaktualne. Thejsonlite pakiet spłaszcza się automatycznie.

Mam do czynienia z strumieniami danych online, które mają kodowanie oparte na rekordach, zwykle w JSON. Struktura obiektu (tj. Nazwy w JSON) są znane z dokumentacji API, jednak wartości są w większości opcjonalne i nie występują w każdym rekordzie. Listy mogą zawierać nowe listy, a struktura jest czasami dość głęboka. Oto prosty przykład niektórych danych GPS:http://pastebin.com/raw.php?i=yz6z9t25. Zauważ, że w dolnych rzędach"l" obiekt brakuje z powodu braku sygnału GPS.

Szukam eleganckiego sposobu spłaszczenia tych obiektów w ramce danych. Obecnie używam czegoś takiego:

library(RJSONIO)
library(plyr)

obj <- fromJSON("http://pastebin.com/raw.php?i=yz6z9t25", simplifyWithNames=FALSE, simplify=FALSE)
flatdata <- lapply(obj$data, as.data.frame);
mydf <- rbind.fill(flatdata)

To działa, ale jest powolne i podatne na błędy. Problem z tym podejściem polega na tym, że nie wykorzystuję mojej wiedzy o strukturze (nazwach obiektów) w danych; zamiast tego wynika z danych. Prowadzi to do problemów, gdy pewna nieruchomość jest nieobecna w każdym rekordzie. W takim przypadku w ogóle nie pojawi się w ramce danych, zamiast kolumny z wartościami NA. Może to prowadzić do problemów poniżej. Na przykład muszę przetworzyć znacznik czasu lokalizacji:

mydf$l.t <- structure(mydf$l.t/1000, class="POSIXct")

Jednakże spowoduje to błąd w przypadku zbioru danych, w któryml$t obiekt nie istnieje. Ponadto obaas.data.frame irbind.fill spowalniaj wszystko. Przykładowy zestaw danych jest stosunkowo mały. Wszelkie sugestie dotyczące lepszej implementacji? Solidne rozwiązanie zawsze dawałoby ramkę danych z tymi samymi kolumnami w tej samej kolejności i gdzie zmienia się tylko liczba wierszy.

Edytuj: poniżej zestawu danych z większą ilością metadanych. Jest większy i zagnieżdżony głębiej:

obj <- fromJSON("http://www.stat.ucla.edu/~jeroen/files/output.json", simplifyWithNames=FALSE, simplify=FALSE)

questionAnswers(3)

yourAnswerToTheQuestion