我正在尝试将嵌套的列表结构转换为数据框。列表类似于以下内容(这是使用httr包解析JSON读取的序列化数据)。
myList <- list(object1 = list(w=1, x=list(y=0.1, z="cat")), object2 = list(w=NULL, x=list(z="dog")))
编辑:我的原始例子数据太简单了。实际数据是参差不齐的,意味着并非每个对象都存在所有变量,并且某些列表元素为空。我已编辑数据以反映这一点。
unlist(myList)
很好地递归地展开了列表,然后我可以使用 lapply
很好地展开所有对象。
flatList <- lapply(myList, FUN= function(object) {return(as.data.frame(rbind(unlist(object))))})
最后,我可以使用plyr :: rbind.fill
来合并它们。
myDF <- do.call(plyr::rbind.fill, flatList)
str(myDF)
#'data.frame': 2 obs. of 3 variables:
#$ w : Factor w/ 2 levels "1","2": 1 2
#$ x.y: Factor w/ 2 levels "0.1","0.2": 1 2
#$ x.z: Factor w/ 2 levels "cat","dog": 1 2
问题在于 w 和 x.y 现在被解释为字符向量,在数据框中默认解析为因子。我认为 unlist()
是罪魁祸首,但我找不到另一种递归展开列表结构的方法。一种解决方法是后处理数据框,然后分配数据类型。最佳方法是确定向量是否为有效的数值或整数向量?
lapply(myList, as.data.frame)
创建 "flatList",因为有一个名为as.data.frame.list
的方法;unlist
将你的 "list" 转换为原子向量,并将所有内容强制转换为 "character"。 - alexis_lazplyr::rbind.fill(lapply(myList, as.data.frame))
相当优雅!如果你回答的话,我会接受它。 - Andrew Barr