Соединение трех таблиц в R, каждая из которых имеет разные ключи - PullRequest
0 голосов
/ 08 июня 2019

У меня есть три таблицы: ЗАКАЗЧИК (PK: CustomerNum), БРОНИРОВАНИЕ (PK: CustomerNum и TripID NOT PK) и TRIP (PK: TripID).Попытка использовать purr: lower.

Попробовал следующий код.

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

Ошибка: by не может содержать столбец соединения TripID, который отсутствует в LHS

1 Ответ

1 голос
/ 08 июня 2019

Мы можем использовать цикл 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 в зависимости от наличия общего имени столбца на основе воспроизводимого примера ниже.Поскольку ФП не привел ни одного воспроизводимого примера, остается неясным ситуация

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

data

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...