【发布时间】:2011-05-29 14:06:19
【问题描述】:
我经常想将其中每个索引具有相同元素类型的列表转换为数据框。例如,我可能有一个列表:
> my.list
[[1]]
[[1]]$global_stdev_ppb
[1] 24267673
[[1]]$range
[1] 0.03114799
[[1]]$tok
[1] "hello"
[[1]]$global_freq_ppb
[1] 211592.6
[[2]]
[[2]]$global_stdev_ppb
[1] 11561448
[[2]]$range
[1] 0.08870838
[[2]]$tok
[1] "world"
[[2]]$global_freq_ppb
[1] 1002043
我想将此列表转换为每个索引元素都是一列的数据框。 (对我来说)很自然的事情是使用do.call:
> my.matrix<-do.call("rbind", my.list)
> my.matrix
global_stdev_ppb range tok global_freq_ppb
[1,] 24267673 0.03114799 "hello" 211592.6
[2,] 11561448 0.08870838 "world" 1002043
很简单,但是当我尝试将此矩阵转换为数据框时,列仍然是列表元素,而不是向量:
> my.df<-as.data.frame(my.matrix, stringsAsFactors=FALSE)
> my.df[,1]
[[1]]
[1] 24267673
[[2]]
[1] 11561448
目前,为了正确转换数据框,我使用unlist 和as.vector 遍历每一列,然后重新转换数据框:
new.list<-lapply(1:ncol(my.matrix), function(x) as.vector(unlist(my.matrix[,x])))
my.df<-as.data.frame(do.call(cbind, new.list), stringsAsFactors=FALSE)
然而,这似乎非常低效。有没有更好的方法来做到这一点?
【问题讨论】:
-
见
?data.table::rbindlist -
从 2017 年开始,您应该使用来自
purrr的your_list %>% reduce(bind_rows)