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步替代方案:替换NULL为NA:
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)