#sql #r #join #data-manipulation #fuzzy-logic
#sql #r #Присоединиться #манипулирование данными #нечеткая логика
Вопрос:
Я работаю с языком программирования R. У меня есть следующие таблицы (примечание: все переменные отображаются как «Факторы»):
table_1 = data.frame(id = c("123", "123", "125", "C125-B"), date_1 = c("2010-01-31","2010-01-31", "2016-01-31", "2018-01-31" )) table_1$id = as.factor(table_1$id) table_1$date_1 = as.factor(table_1$date_1) table_2 = data.frame(id = c("5123", "123 A", "125", "125"), 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$date_2 = as.factor(table_2$date_2) table_2$date_3 = as.factor(table_2$date_3) gt; table_1 id date_1 1 123 2010-01-31 2 123 2010-01-31 3 125 2016-01-31 4 C125-B 2018-01-31 table_2 id date_2 date_3 1 5123 2009-01-31 2011-01-31 2 123 A 2010-01-31 2010-01-31 3 125 2010-01-31 2020-01-31 4 125 2010-01-31 2020-01-31
Я пытаюсь «присоединиться» (например, внутреннее соединение) к этим таблицам при следующих условиях:
1) if table_1$id "fuzzy equal" table_2$id
и
2) if table_1$date BETWEEN(table_2$date_2,table_2$date_3)
Я попытался написать следующий код на R, чтобы сделать это:
library(fuzzyjoin) stringdist_inner_join(table_1, table_2, by ="id", distance_col = NULL)
Вопрос: Но я не уверен, что stringdist_inner_join
функция может вместить такую логику «между».
Может кто-нибудь, пожалуйста, показать мне, как это сделать? Существуют ли какие-либо другие методы для достижения этой цели в R?
Спасибо!
Комментарии:
1. С каким намерением вы превращаете свои свидания в факторы? Не затруднит ли это сравнение их в хронологическом порядке?
2. @ Джон Спринг: Спасибо за ваш ответ! Даты в моем первоначальном наборе являются факторами.
Ответ №1:
Как насчет этого? Мы могли бы выполнить stringdist_inner_join и затем отфильтровать, хранятся ли даты как даты. Это должно быть достаточно эффективно для большинства данных, а если нет, то вам, вероятно, следует использовать data.table вместо fuzzyjoin.
library(fuzzyjoin) library(dplyr) table_1$date_1 = as.Date(table_1$date_1) table_2$date_2 = as.Date(table_2$date_2) table_2$date_3 = as.Date(table_2$date_3) stringdist_inner_join(table_1, table_2, by = "id", max_dist = 2) %gt;% filter(date_1 gt;= date_2, date_1 lt;= date_3) id.x date_1 id.y date_2 date_3 1 123 2010-01-31 5123 2009-01-31 2011-01-31 2 123 2010-01-31 123 A 2010-01-31 2010-01-31 3 123 2010-01-31 125 2010-01-31 2020-01-31 4 123 2010-01-31 125 2010-01-31 2020-01-31 5 123 2010-01-31 5123 2009-01-31 2011-01-31 6 123 2010-01-31 123 A 2010-01-31 2010-01-31 7 123 2010-01-31 125 2010-01-31 2020-01-31 8 123 2010-01-31 125 2010-01-31 2020-01-31 9 125 2016-01-31 125 2010-01-31 2020-01-31 10 125 2016-01-31 125 2010-01-31 2020-01-31
Комментарии:
1. @ Джон Спринг: Спасибо за ваш ответ! Не могли бы вы объяснить, пожалуйста, почему «max_dist = 2»? Спасибо!
2. Почему шрифт зеленый?
3. Я просто делаю предположение о хорошем значении ваших данных (это также значение по умолчанию, поэтому указывать его не нужно).
4. @jay.sf, я понятия не имею! Я не думал, что сделал что-то другое, любопытно, что вызвало это.
5. @ Джон Спринг: Если у вас есть время, не могли бы вы, пожалуйста, взглянуть на некоторые другие мои вопросы?