编辑:这个问题已经过时了。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)