R: Объединения на основе операторов «ИЛИ»

#sql #r #join #dplyr #data-manipulation

#sql #r #Присоединиться #dplyr #манипулирование данными

Вопрос:

Я работаю с языком программирования R. Предположим, у меня есть следующие две таблицы:

 table_1 = data.frame(id = c("123", "123", "125", "125"), id2 = c("11", "12", "14", "13"), date_1 = c("2010-01-31","2010-01-31", "2015-01-31", "2018-01-31" ))  table_1$id = as.factor(table_1$id) table_1$id2 = as.factor(table_1$id2) table_1$date_1 = as.factor(table_1$date_1)  table_2 = data.frame(id = c("123", "123", "125", "125"), id2 = c("111", "112", "14", "113"), date_2 = c("2009-01-31","2010-01-31", "2010-01-31", "2010-01-31" ), date_3 = c("2011-01-31","2010-01-31", "2020-01-31", "2020-01-31" ))   table_2$id = as.factor(table_2$id) table_2$id2 = as.factor(table_2$id2) table_2$date_2 = as.factor(table_2$date_2) table_2$date_3 = as.factor(table_2$date_3)  

Я хочу выполнить «соединение» (подойдет любое соединение, я просто хочу узнать, как это сделать в целом), если выполнено любое из следующих двух условий (т. Е. Если Condition_1 = TRUE ИЛИ Condition_2 = TRUE, ТО «присоединиться»)

Условие_1

  1. если table_1$id = table_2$id

и

  1. если таблица 1$дата МЕЖДУ(таблица 2$дата 2,таблица 2$дата 3)

Условие_2

  1. если table_1$id2 = table_2$id2

и

  1. если таблица 1$дата МЕЖДУ(таблица 2$дата 2,таблица 2$дата 3)

Что я уже пробовал: я знаю, как выполнять оба этих соединения по отдельности, например:

 library(sqldf)  #Condition_1   final = sqldf("select a.*, b.*    from table_1 a left join table_2 b  on a.id = b.id and   a.date_1 between   b.date_2 and  b.date_3")    #Condition_2   final_2 = sqldf("select a.*, b.*    from table_1 a left join table_2 b  on a.id2 = b.id2 and   a.date_1 between   b.date_2 and  b.date_3")   

Затем я могу «связать» эти файлы («final_3») вместе (и удалить строки, которые являются полными дубликатами). :

 final_3 = rbind(final, final_2)  final_3 = final_3[!duplicated(final_3[c(1,2,3,4,5,6,7)]),]  

Мой вопрос: Вместо двух отдельных шагов, есть ли способ объединить обе эти таблицы вместе за один шаг? Можно ли это сделать с помощью базы R или DPLYR?

Спасибо!

Комментарии:

1. в чем разница между final и final_2? Final_2, похоже, является копией final.

2. @Onyambu final есть id и final_2 есть id2 . Мне интересно, как это сделать за один шаг…

Ответ №1:

Это можно сделать в одной инструкции SQL следующим образом.

 library(sqldf)  sqldf("select distinct *   from table_1 a left join table_2 b  on (a.date_1 between b.date_2 and b.date_3) and   (a.id = b.id or a.id2 = b.id2)")  

Комментарии:

1. @ G. Гротендик : Спасибо за ваш ответ!