很多时候,我想把一个列表转换成一个数据框,其中每个索引都有相同的元素类型。例如,我可能有这样一个列表:
> 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
。 - marbelpurrr
中的your_list %>% reduce(bind_rows)
。 - Zafar