R语言:如何将含多个tibble的列表合并为单个data.frame?
解决列表中多个tibble合并为单个数据框的问题
嗨,我来帮你搞定这个问题~你之前用map的思路其实走偏了:map的核心是对列表里的每个元素单独执行操作,所以不管你用map(rbind.data.frame)还是map(as.data.frame),最终得到的还是和原列表长度一致的列表,只是每个元素被转成了data.frame而已,并没有把它们合并到一起。
要把3个38行的tibble合并成114行的单个数据框/tibble,你可以用下面这几种简单的方法:
方法1:用dplyr的bind_rows(最推荐)
bind_rows是dplyr专门用来按行合并数据框/tibble的函数,它直接支持传入一个数据框列表,一步就能完成合并,还会保留tibble的特性:
library(dplyr) my_data_frame <- my_list %>% bind_rows()
或者不用管道的写法:bind_rows(my_list),效果完全一样。
方法2:用purrr的reduce
如果你习惯用purrr包的函数,可以用reduce——它会把列表里的元素依次用指定的合并函数(比如rbind)组合起来,最终得到一个单个对象:
library(purrr) my_data_frame <- my_list %>% reduce(rbind)
这个逻辑是先把列表的第一个和第二个tibble用rbind合并,再把合并后的结果和第三个tibble继续rbind,最终得到你要的大数据框。
方法3:基础R的do.call
如果不想加载额外的包,用基础R的do.call也能解决:
my_data_frame <- do.call(rbind, my_list)
do.call会把rbind函数应用到my_list的所有元素上,相当于手动执行rbind(my_list[[1]], my_list[[2]], my_list[[3]]),但写法更简洁。
小提示
- 如果你需要的是标准的data.frame而不是tibble,可以在合并后用
as.data.frame()转换,比如:my_data_frame <- my_list %>% bind_rows() %>% as.data.frame() bind_rows相比rbind的优势是:如果各个tibble的列名不完全一致,它会自动填充NA,而不会报错,容错性更强。
内容的提问来源于stack exchange,提问作者onhalu
相关产品推荐
相关产品推荐

