Achatar lista / objeto baseado em registro em dataframe
Edit: esta questão está desatualizada. ojsonlite pacote achata automaticamente.
Estou lidando com fluxos de dados on-line que possuem codificação baseada em registros, geralmente em JSON. A estrutura do objeto (ou seja, os nomes no JSON) são conhecidos da documentação da API, no entanto, os valores são em sua maioria opcionais e não estão presentes em todos os registros. As listas podem conter novas listas e a estrutura é às vezes bastante profunda. Aqui está um exemplo bastante simples de alguns dados de GPS:http://pastebin.com/raw.php?i=yz6z9t25. Note que nas linhas inferiores, o"l"
objeto está faltando devido a nenhum sinal de GPS.
Eu estou procurando uma maneira elegante de achatar esses objetos em um dataframe. Atualmente estou usando algo assim:
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)
Isso faz o trabalho, mas é lento e propenso a erros. Um problema com essa abordagem é que não estou usando meu conhecimento sobre a estrutura (nomes de objeto) nos dados; em vez disso, infere-se dos dados. Isso leva a problemas quando uma certa propriedade está ausente em todos os registros. Nesse caso, ele não aparecerá no dataframe, em vez de uma coluna com valores de NA. Isso pode levar a problemas a jusante. Por exemplo, preciso processar o registro de data e hora da localização:
mydf$l.t <- structure(mydf$l.t/1000, class="POSIXct")
No entanto, isso resultará em um erro no caso de um conjunto de dados no qual ol$t
objeto não está lá. Além disso, tanto oas.data.frame
erbind.fill
faça as coisas bem devagar. O conjunto de dados de exemplo é relativamente pequeno. Alguma sugestão para melhor implementação? Uma solução robusta sempre produziria um dataframe com as mesmas colunas na mesma ordem e onde apenas o número de linhas varia.
Edit: abaixo de um conjunto de dados com mais metadados. É maior em tamanho e aninhado mais profundamente:
obj <- fromJSON("http://www.stat.ucla.edu/~jeroen/files/output.json", simplifyWithNames=FALSE, simplify=FALSE)