我有一个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
我更喜欢rbindlist从data.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)
看起来你可以bind_rows从dplyr的开发版本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)