我需要一个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_rowsdata.table::rbindlistfill = 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

使现代化

这里只是一个简单的例子.实际上,我不能假定子列表元素的名称(示例中为abz),也不能假定子列表的长度(示例中为2、1、1、2).

以下是预期data.frame和输入mylist的假设:

  1. 预期data.frame的列数由子列表的最大长度决定,该长度可能从1到几百不等.关于每个子列表的长度,没有明确的信息来源(子列表未知时,哪些名称将出现或消失)
  2. 预期data.frame 的行数由mylist的长度决定,mylist的长度可以从1到数千不等
  3. 子列表元素的名称及其顺序没有明确的信息,因此预期data.frame的列名和顺序只能从mylist中确定
  4. 每个子列表包含numericcharacterlist类型的元素.为了简化问题,只考虑numericcharacter.

推荐答案

以R为基数的较短解决方案是

make_df <- function(a = NA, b = NA, z = NA) {
  data.frame(a = unlist(a), b = unlist(b), z = unlist(z))
}

do.call(rbind, lapply(mylist, function(x) do.call(make_df, x)))
#>    a  b    z
#> 1  1  2 <NA>
#> 2  3 NA <NA>
#> 3 NA  5 <NA>
#> 4  9 NA    k

Update

使用相同方法但不需要特定名称的更通用解决方案是:

build_data_frame <- function(obj) {
  nms     <- unique(unlist(lapply(obj, names)))
  frmls   <- as.list(setNames(rep(NA, length(nms)), nms))
  dflst   <- setNames(lapply(nms, function(x) call("unlist", as.symbol(x))), nms)
  make_df <- as.function(c(frmls, call("do.call", "data.frame", dflst)))
  
  do.call(rbind, lapply(mylist, function(x) do.call(make_df, x)))
}

这允许

build_data_frame(mylist)
#>    a  b    z
#> 1  1  2 <NA>
#> 2  3 NA <NA>
#> 3 NA  5 <NA>
#> 4  9 NA    k

R相关问答推荐

在不安装软件包的情况下测试更新

在R中使用数据集名称

在组中添加值增加和减少的行

如何在geom_col中反转条

将包含卷的底部25%的组拆分为2行

如何在观测缺失的地方添加零

如果可能,将数字列转换为整数,否则保留为数字

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

如何基于两个条件从一列中提取行

派生程序包| ;无法检索';return()';的正文

如何使用同比折线图中的个别日

在点图上绘制置信度或预测区间ggplot2

循环遍历多个变量,并将每个变量插入函数R

`-`是否也用于数据帧,有时使用引用调用?

数值型数据与字符混合时如何进行绑定

如何显示准确的p值而不是<;0.001*?

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

为什么R列名称忽略具有指定名称的向量,而只关注索引?

与另一个数据帧同名的变异/筛选列

当执行一个比下游react 链慢的耗时的函数时,如何防止shiny 的react 对象反弹?