свести список / объект на основе записей в фрейм данных

Изменить: этот вопрос устарел.jsonlite пакет сглаживается автоматически.

Я имею дело с потоковыми данными, которые имеют кодирование на основе записей, обычно в формате JSON. Структура объекта (то есть имена в JSON) известна из документации API, однако значения в основном являются необязательными и не присутствуют в каждой записи. Списки могут содержать новые списки, а структура иногда довольно глубокая. Вот довольно простой пример некоторых данных GPS:http://pastebin.com/raw.php?i=yz6z9t25, Обратите внимание, что в нижних строках"l" объект отсутствует из-за отсутствия сигнала GPS.

Я ищу элегантный способ сплющить эти объекты в кадре данных. В настоящее время я использую что-то вроде этого:

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)

Это делает работу, однако это медленно и немного подвержено ошибкам. Проблема этого подхода заключается в том, что я не использую свои знания о структуре (именах объектов) в данных; вместо этого это выводится из данных. Это приводит к проблемам, когда определенное свойство отсутствует в каждой записи. В этом случае он вообще не будет отображаться в кадре данных вместо столбца со значениями NA. Это может привести к проблемам ниже по течению. Например, мне нужно обработать временную метку местоположения:

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

Однако это приведет к ошибке в случае набора данных, в которомl$t объекта там нет. Кроме того, обаas.data.frame а такжеrbind.fill сделать вещи довольно медленно Примерный набор данных является относительно небольшим. Есть предложения по улучшению реализации? Надежное решение всегда приводит к кадру данных с одинаковыми столбцами в одном и том же порядке, в котором изменяется только количество строк.

Изменить: под набором данных с большим количеством метаданных. Он больше по размеру и вложен глубже:

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

Ответы на вопрос(3)

Ваш ответ на вопрос