如何构建接收多个DataFrame并合并的函数?适配dplyr/purrr更新
我来帮你搞定这个多DataFrame合并的函数问题,顺便聊聊dplyr和purrr的近期更新~
解决多DataFrame合并的函数问题
你之前尝试用!!!没成功,大概率是没处理好函数的参数输入方式。这里给你两种实用的实现方案:
方案1:直接接收多个单独的DataFrame
如果你的使用场景是直接传入df_1, df_2, df_3这种独立的DataFrame,用可变参数...就可以轻松搞定,根本不需要额外的拆包操作:
library(tidyverse) get_bind_dfs <- function(...){ # bind_rows本身就支持直接接收多个DataFrame参数 dplyr::bind_rows(...) } # 测试一下 df_1 = mtcars %>% slice(1:2) df_2 = mtcars %>% slice(6:8) df_3 = mtcars %>% slice(30:32) get_bind_dfs(df_1, df_2, df_3)
方案2:接收DataFrame列表作为输入
如果你的数据是打包成列表传入的,那更简单——新版dplyr的bind_rows直接支持列表输入,无需手动拆包:
get_bind_dfs <- function(df_list){ dplyr::bind_rows(df_list) # 也可以用purrr的reduce做自定义合并(比如需要特殊逻辑时): # purrr::reduce(df_list, dplyr::bind_rows) } # 测试 df_list <- list(df_1, df_2, df_3) get_bind_dfs(df_list)
dplyr & purrr的近期关键更新(v1.0.0+)
- bind_rows的列表支持:从dplyr 1.0.0开始,
bind_rows彻底支持直接传入DataFrame列表,不用再像以前那样手动用!!!拆包,代码更简洁,性能也有提升。 - 异构列处理优化:现在合并不同列的DataFrame时,会自动给缺失的列填充NA,而且报错提示更清晰,调试更方便。
- purrr的reduce简化:purrr的
reduce函数对数据框合并的兼容性更好,写法更直观,但如果只是简单的行合并,直接用bind_rows处理列表已经足够高效。
为啥之前用!!!没成功?
如果你之前写的是bind_rows(!!!one_or_more_dfs),问题可能出在参数定义上:
- 如果你的函数参数是
function(one_or_more_dfs),但调用时传入的是df_1, df_2, df_3,那one_or_more_dfs只会拿到第一个DataFrame,后面的参数会被忽略——这时候应该把参数改成...来接收多个输入。 - 要是你传入的是列表但还是报错,那可能是旧版本的dplyr,升级到1.0.0+就可以解决这个问题。
内容的提问来源于stack exchange,提问作者runningbirds
相关产品推荐
相关产品推荐

