【问题标题】:Merge multiple dataframes with Reduce() and list()使用 Reduce() 和 list() 合并多个数据帧
【发布时间】:2021-08-11 23:30:14
【问题描述】:

我需要在第一列合并大量具有顺序名称(df1、df2、df3、...)的数据框。

如果我使用下面的代码(假设 3 个数据帧),它可以正常运行:

merged_df <- Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))

但我有 100 个数据框。 如何更改代码以便不必手动编写数据框列表?

我试过这样:

df_list <- lapply(paste0("df",1:100), as.name)
merged_df <- Reduce(function(x, y) merge(x, y, all=TRUE), list(df_list))

但它不起作用......

【问题讨论】:

  • 您不能只将变量名称添加为字符。 "df1" df1 不同。一个是人物,另一个是名字。您应该在阅读它们时填写数据框列表。我假设它们存储在文件或数据库中,并且您从这个源中读取它们。在阅读时,您可以将它们附加到一个列表中,而不是将每个都存储到一个新变量中。然后,您可以将它们作为df_list[[i]] 访问第 i 个数据帧。或者,您可以在 Reduce() 调用中使用完整列表作为参数。
  • 感谢@MartinWettstein 的建议,我已经以这种方式实现它并运行它:file_names = list.files(pattern=".xlsx$")(它需要目录中的所有文件,扩展名为 .xlsx,但我把目录只包含我的数据帧 df1.xlsx、df2.xlxs 等,它会一次将它们全部附加到列表中)、df_list = lapply(file_names, read_excel, sheet=1)merged_df &lt;- Reduce(function(x, y) merge(x, y, all=TRUE), df_list)
  • 是的,这看起来像是一个干净的解决方案。

标签: r list merge


【解决方案1】:

您可以将工作环境中的mget()所有数据框放入一个列表中,如下所示:

df_list <- mget(paste0("df",1:100))
merged_df <- Reduce(
  function(x, y) merge(x, y, all=TRUE), 
  df_list
)

请注意,更好的解决方案是首先将这些数据帧创建/读取到一个列表中,而不是放入不同的对象中。

【讨论】:

    【解决方案2】:

    tidyverse 选项

    library(dplyr)
    library(purrr)
    library(stringr)
    mget(str_c('df', 1:100)) %>%
        reduce(full_join)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 2020-11-22
      • 2017-01-15
      • 1970-01-01
      • 2021-05-15
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多