2013-04-03 63 views
14

给出一个列表数据帧:转换[R列表缺失/ null元素

alist = list(
    list(name="Foo",age=22), 
    list(name="Bar"), 
    list(name="Baz",age=NULL) 
) 

什么是将此转换成与姓名和年龄列的数据框的最佳途径,缺失值(我会接受NA或“”按照优先顺序)?

使用ldply的简单方法会失败,因为它会尝试将每个列表元素转换为数据框,但由于长度不匹配而使用NULL barfs。最好的我目前所面对的是:

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

但是那是相当恶心和数值变量变成一个因素......

+0

恼人的那种'check.rows = FALSE'还提供了有关具有不同数量的观测... –

回答

10

注释提到希望只有一个回路,它可以与@flodel's answer只是把体内的两个循环一起实现:

rbind.fill(lapply(alist, function(f) { 
    as.data.frame(Filter(Negate(is.null), f)) 
})) 

name age 
1 Foo 22 
2 Bar NA 
3 Baz NA 
17

第一步:卸下NULL项目

non.null.list <- lapply(alist, Filter, f = Negate(is.null)) 

第二步:堆叠在一起的一切:

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

编辑:如果您的所有列表项目的变量为NULL,则它不会显示在您的最终输出中。相反,如果你想充满NA列,第一步应该不会删除NULL秒,但与NA小号替换它们:

步骤1替代:用NA替换NULL

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x)) 
+0

那第二步是这个问题的主题行错误:http://stackoverflow.com/问题/ 15753091 /转换混合长度命名列表到数据框/ 15753384#15753384,为此Josh O'Brien有一个更长,但更具扩展性的答案。 – flodel

+0

我坚持只有一个循环/应用步骤的解决方案...否则,这似乎破解它。 – Spacedman