#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
- если table_1$id = table_2$id
и
- если таблица 1$дата МЕЖДУ(таблица 2$дата 2,таблица 2$дата 3)
Условие_2
- если table_1$id2 = table_2$id2
и
- если таблица 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. Гротендик : Спасибо за ваш ответ!