如何在R中一一自动化多个数据帧与单个数据帧的左连接

数据挖掘 r 编程
2022-03-05 07:17:05

我有 206 个以国家(法国、德国、香港...)命名的数据框,在这 206 个文件中有相同的 37 个变量,另一个数据框名称为 pf,有 9 个变量。

我想将这 206 个数据帧与 PF 数据帧一一选择所有变量并存储在其他数据帧中。左连接基于两个条件(hcom_id=tnow_id 和 city=region)。hcom_id 和 city 是 206 个不同数据帧中的变量,tnow_id 和 region 在 PF 中

我正在使用 sqldf 包加入:a<-sqldf("select * from FRANCE left join PF on (FRANCE.hcom_id=pf.tnow_id and FRANCE.city=pf.region)")

我正在努力使用循环来自动化它,而不是单独执行 206 次。

任何想法请提出

3个回答

如果您的数据已经以干净的形式存在于数据库中:

为您的 206 个国家/地区表编写一个包含一系列 UNION 语句的 sql 语句。您可以使用 R 或任何其他编程语言来创建此字符串。

将这一系列 206 个 UNION 保存为视图(可能是索引视图/物化视图)、新表或在数据库服务器上创建临时表的存储过程

在数据库服务器上执行一次 SQL 连接

批量获取数据

在不查看数据框的情况下,我很难告诉你我可以做到这一点的精确方法。

但是,我可能采用的方法将涉及以下步骤:

  • 加载所有206个数据框;
  • 重命名所有变量,使它们以数据框名称开头(在这里sub + 应用或循环可能就足够了);
  • 明智地附加所有数据框列(丑陋,我知道);
  • 使用tidyr重塑数据并以这样的方式分隔日期,以便我能够将其与 PF 数据框连接起来;

这最后一步有点含糊,但这就是我的处理方式。

这是该问题的一种可能解决方案(如果数据帧适合内存):

  1. 将数据框放入列表中,将列表条目命名为数据框名称
  2. 将 sqldf 命令包装成一个带有一个输入的函数,names(list)
  3. 使用 lapply 将函数应用于列表中的每个数据框

这是一个可以工作的示例函数。它需要一个输入数据框并左连接来自数据框 PF 的列。

sqldf_join_wrapper = function(df_title) {

    temp_df = sqldf(
    paste0("SELECT distinct a.* 
           FROM ", df_title, " a
           LEFT JOIN PF b
           ON (a.hcom_id = b.tnow_id and a.city = b.region)")
    )

    return(temp_df)
}

您可以在 lapply 语句中使用此函数将 PF 中的列一次左连接到您所在国家/地区的所有 206 个数据框中(假设它们在列表中)。但是,您需要将输入数据帧的标题传递给 sql 字符串,根据我的反复试验,似乎 lapply 使它有点困难。这是一个解决方案:

output_list = lapply(names(initial_list_of_dfs), sqldf_join_wrapper)

然后输出列表应包含初始数据帧。