编辑:这个问题已经过时了。 jsonlite 包会自动进行展平。
我正在处理具有基于记录编码的在线数据流,通常为JSON格式。对象的结构(即JSON中的名称)从API文档中已知,然而,大多数情况下值是可选的,并且不在每个记录中都存在。列表可以包含新列表,结构有时相当深。这里是一些GPS数据的简单示例:http://pastebin.com/raw.php?i=yz6z9t25。请注意,在较低的行中,由于没有GPS信号,"l"
对象丢失了。
我正在寻找一种将这些对象展平为数据框的优雅方式。我目前正在使用类似于以下内容的东西:
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)