首页 > 解决方案 > 连接 R 中的三个表,每个表都有不同的键

问题描述

我有三个表:CUSTOMER(PK:CustomerNum)、RESERVATION(PK:CustomerNum 和 TripID NOT PK)和 TRIP(PK:TripID)。尝试使用 purr:reduce。

尝试了以下代码。

tables <- list(customer, reservation, trip)
reduce(tables, inner_join, by = c("CustomerNum", "TripID"))

错误:by不能包含TripIDLHS 中缺少的连接列

标签: rjoin

解决方案


当每一步的列不同时,我们可以使用for循环by

grp <- c("CustomerNum", "TripID")
out <- customer
for(i in seq_along(grp)) {
     out <- inner_join(out, tables[[i+1]], by = grp[i])
  }

out
#  CustomerNum        val TripID newInfo
#1           1 -0.5458808      4       *
#2           2  0.5365853      2    ****

然后select是感兴趣的列


请注意,如果我们不提供by,它将by根据下面可重现的示例根据公共列名的可用性自动选择 。由于 OP 没有提供任何可重复的示例,因此情况尚不清楚

reduce(tables, inner_join)
#Joining, by = "CustomerNum"  #### <-----
#Joining, by = "TripID"       #### <-----
#  CustomerNum        val TripID newInfo
#1           1 -0.5458808      4       *
#2           2  0.5365853      2    ****

数据

set.seed(24)
customer <- data.frame(CustomerNum = 1:5, val = rnorm(5))
reservation <- data.frame(CustomerNum = 1:3, TripID = c(4, 2, 8))
trip <- data.frame(TripID = c(4, 9, 2), newInfo = c("*", "**", "****"))
tables <- list(customer, reservation, trip)

推荐阅读