data.frame的命名列表列表

div*_*ero 11 r dplyr

我有一个JSON对象的以下表单的命名列表列表:

my_list = list(list(a = 10, b = "blah"), 
               list(a = 15, b = "stuff"))
Run Code Online (Sandbox Code Playgroud)

外部列表的每个元素都是一个命名列表,我想将它转换为以下形式的data.frame,列名完整:

a   b 
10  "blah" 
15  "stuff"
Run Code Online (Sandbox Code Playgroud)

从表面上看,我可以做到这一点to_df = data.frame(do.call(rbind, my_list)).

但是,如果我尝试使用单个列提取to_df$a或者to_df[,1]我将获得一个列表而不是像data.frame通常所期望的那样的向量:

> to_df[,1]
[[1]]
[1] 10

[[2]]
[1] 15
Run Code Online (Sandbox Code Playgroud)

代替:

> to_df[,1]
[1] 10 15
Run Code Online (Sandbox Code Playgroud)

R邮件列表上的一篇旧帖子提出了以下解决方案:to_df = as.data.frame(t(sapply(my_list, rbind))).但是,这不仅不会转移到列名称,它仍然具有在使用时查看单个列时返回列表而不是向量的相同问题to_df[,1].

实现这一目标的最佳方法是什么?有dplyr办法吗?

编辑:感谢所有解决方案,似乎诀窍是lapply将列表的每个元素转换为a data.frame然后使用dplyr或它们将它们绑定在一起do.call.或者,data.table大多数工作只需一次调用即可rbindlist.

Ric*_*ven 13

我更喜欢rbindlistdata.table包.它简单,快速,并返回数据框/表.

data.table::rbindlist(my_list)
#     a     b
# 1: 10  blah
# 2: 15 stuff
Run Code Online (Sandbox Code Playgroud)

另一个优点rbindlist()是它会自动填充缺失值NA.

要删除data.table该类,您只需要包装即可as.data.frame()

as.data.frame(data.table::rbindlist(my_list))
Run Code Online (Sandbox Code Playgroud)


aos*_*ith 7

看起来你可以bind_rowsdplyr的开发版本dplyr_0.4.2.9002开始,就像两天前一样.

library(dplyr)
bind_rows(my_list)

Source: local data frame [2 x 2]

   a     b
1 10  blah
2 15 stuff
Run Code Online (Sandbox Code Playgroud)


A. *_*ebb 6

在基地R你可能会这样做

df<-do.call(rbind,lapply(my_list,data.frame))
Run Code Online (Sandbox Code Playgroud)