临时环境中合并多个data frame出错,如何正确实现?
问题原因与解决方案
错误原因
mget(names(tenv), envir = tenv)返回的是由多个数据框组成的列表,直接调用rbind()时,R会将这个列表视为单个输入参数,最终把每个数据框作为一列拼接,而不是按行合并所有数据框,这就是你得到奇怪结果的原因。
正确解决方案
以下几种方法都能实现你期望的按行合并效果:
方法1:使用do.call()传递列表元素为独立参数
do.call()会把列表中的每个元素作为rbind()的独立参数传入,从而完成行合并:
do.call(rbind, mget(names(tenv), envir = tenv))
方法2:使用dplyr::bind_rows()(tidyverse风格)
bind_rows()支持直接接收数据框列表作为输入,语法更简洁直观:
library(dplyr) bind_rows(mget(names(tenv), envir = tenv))
方法3:使用purrr::map_dfr()(tidyverse风格)
map_dfr()会遍历列表中的每个数据框,并自动按行合并结果:
library(purrr) map_dfr(tenv, identity)
验证结果
以上任意一种方法执行后,都会得到你期望的输出:
r1 r2 1 1 a 2 2 a 3 1 b 4 2 b 5 1 c 6 2 c 7 1 d 8 2 d 9 1 e 10 2 e
内容的提问来源于stack exchange,提问作者QQQ-17
相关产品推荐
相关产品推荐

