将R列表转换为具有missing/NULL元素的数据帧

Spa*_*man 18 r list plyr dataframe

给出一个清单:

alist = list(
  list(name="Foo",age=22),
  list(name="Bar"),
  list(name="Baz",age=NULL)
 )
Run Code Online (Sandbox Code Playgroud)

什么是将其转换为具有名称和年龄列的数据框的最佳方式,具有缺失值(我将按优先顺序接受NA或"")?

使用ldply失败的简单方法,因为它尝试将每个列表元素转换为数据帧,但是因为长度不匹配而使用NULL barfs的方法.我现在最好的是:

> ldply(alist,function(s){t(data.frame(unlist(s)))})
  name  age
1  Foo   22
2  Bar <NA>
3  Baz <NA>
Run Code Online (Sandbox Code Playgroud)

但这很icky,数字变量成为一个因素......

flo*_*del 18

第1步:删除NULL项目

non.null.list <- lapply(alist, Filter, f = Negate(is.null))
Run Code Online (Sandbox Code Playgroud)

第二步:将所有东西叠加在一起

library(plyr)
rbind.fill(lapply(non.null.list, as.data.frame))
#   name age
# 1  Foo  22
# 2  Bar  NA
# 3  Baz  NA
Run Code Online (Sandbox Code Playgroud)

编辑:如果您有一个NULL适用于所有列表项的变量,它将不会显示在您的最终输出中.相反,如果你想要一个填充的列NA,第一步不应该删除NULLs但是用NAs 替换它们:

第1步替代方案:替换NULLNA:

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x))
Run Code Online (Sandbox Code Playgroud)


Bri*_*ggs 10

提到的注释只需要一个循环,只需将两个循环的主体放在一起,就可以通过@ flodel的答案来实现:

rbind.fill(lapply(alist, function(f) {
  as.data.frame(Filter(Negate(is.null), f))
}))
Run Code Online (Sandbox Code Playgroud)

  name age
1  Foo  22
2  Bar  NA
3  Baz  NA
Run Code Online (Sandbox Code Playgroud)