我试图实现类似于unlist的功能,但类型不会被强制转换为向量,但会返回包含保留类型的列表.例如:
flatten(list(NA, list("TRUE", list(FALSE), 0L))
Run Code Online (Sandbox Code Playgroud)
应该回来
list(NA, "TRUE", FALSE, 0L)
Run Code Online (Sandbox Code Playgroud)
代替
c(NA, "TRUE", "FALSE", "0")
Run Code Online (Sandbox Code Playgroud)
将由...返回unlist(list(list(NA, list("TRUE", list(FALSE), 0L)).
从上面的例子中可以看出,扁平化应该是递归的.标准R库中是否有一个功能可以实现这一功能,或者至少还有一些其他功能可用于轻松有效地实现这一功能?
更新:我不知道从上面是否清楚,但非名单不应该被夷为平地,即flatten(list(1:3, list(4, 5)))应该返回list(c(1, 2, 3), 4, 5).
编辑:这个问题已经过时了.所述jsonlite软件包自动变平.
我正在处理具有基于记录的编码的在线数据流,通常使用JSON.API文档中已知对象的结构(即JSON中的名称),但是,值大多是可选的,并不存在于每个记录中.列表可以包含新列表,结构有时非常深.以下是一些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)
Run Code Online (Sandbox Code Playgroud)
这样可以完成工作,但是速度慢且容易出错.这种方法的一个问题是我没有使用我对数据中结构(对象名称)的了解; 相反,它是从数据推断出来的.当每个记录中都没有某个属性时,这会导致问题.在这种情况下,它根本不会出现在数据框中,而不是具有NA值的列.这可能导致下游问题.例如,我需要处理位置时间戳:
mydf$l.t <- structure(mydf$l.t/1000, class="POSIXct")
Run Code Online (Sandbox Code Playgroud)
但是,如果数据集中l$t没有对象,则会导致错误.此外无论是as.data.frame和rbind.fill做事情很慢.示例数据集相对较小.有关更好实施的建议吗?一个强大的解决方案总是会产生一个数据帧,该数据帧具有相同顺序的相同列,并且只有行数变化.
编辑:在具有更多元数据的数据集下方.它的尺寸更大,嵌套更深:
obj <- fromJSON("http://www.stat.ucla.edu/~jeroen/files/output.json", simplifyWithNames=FALSE, simplify=FALSE)
Run Code Online (Sandbox Code Playgroud)