我需要一个base R解决方案来将具有不同名称的嵌套列表转换为数据.框架
mylist <- list(list(a=1,b=2), list(a=3), list(b=5), list(a=9, z=list('k'))
convert(mylist)
## returns a data.frame:
##
## a b z
## 1 2 <NULL>
## 3 NA <NULL>
## NA 5 <NULL>
## 9 NA <chr [1]>
我知道用dplyr::bind_rows
或data.table::rbindlist
加fill = TRUE
可以很容易地做到这一点(虽然不理想,因为它用NULL
而不是NA
填充字符列),但我确实需要一个以R为底的解决方案.为了简化这个问题,使用两级嵌套列表也可以,没有三级列表,例如
mylist <- list(list(a=1,b=2), list(a=3), list(b=5), list(a=9, z='k'))
convert(mylist)
## returns a data.frame:
##
## a b z
## 1 2 NA
## 3 NA NA
## NA 5 NA
## 9 NA k
我试过类似的方法
convert <- function(L) as.data.frame(do.call(rbind, L))
这不会填充NA
并添加额外的第z
列
使现代化
这里只是一个简单的例子.实际上,我不能假定子列表元素的名称(示例中为a
、b
和z
),也不能假定子列表的长度(示例中为2、1、1、2).
以下是预期data.frame
和输入mylist
的假设:
- 预期
data.frame
的列数由子列表的最大长度决定,该长度可能从1到几百不等.关于每个子列表的长度,没有明确的信息来源(子列表未知时,哪些名称将出现或消失) - 预期
data.frame
的行数由mylist
的长度决定,mylist
的长度可以从1到数千不等 - 子列表元素的名称及其顺序没有明确的信息,因此预期
data.frame
的列名和顺序只能从mylist
中确定 - 每个子列表包含
numeric
、character
或list
类型的元素.为了简化问题,只考虑numeric
和character
.