full_join по дате плюс один или минус один - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу использовать full_join для объединения двух таблиц. Ниже мой псевдокод:

join <- full_join(a, b, by = c("a_ID" = "b_ID" , "a_DATE_MONTH" = "b_DATE_MONTH" +1 | "a_DATE_MONTH" = "b_DATE_MONTH" -1 | "a_DATE_MONTH" = "b_DATE_MONTH"))

a_DATE_MONTH и b_DATE_MONTH в формате даты "% Y-% m".

Я хочу сделать полное объединение при условии, что a_DATE_MONTH может быть одним месяц до b_DATE_MONTH, ИЛИ один месяц после b_DATE_MONTH, ИЛИ в точности равный b_DATE_MONTH. Спасибо!

1 Ответ

1 голос
/ 07 апреля 2020

Хотя SQL допускает (почти) произвольные условия в операторе соединения (например, a_month = b_month + 1 OR a_month + 1 = b_month), я не нашел dplyr, обеспечивающий такую ​​же гибкость.

Единственный найденный мной способ присоединения в dplyr для всего, кроме a_column = b_column, необходимо выполнить более общее объединение и выполнить фильтрацию впоследствии. Поэтому я рекомендую вам попробовать что-то вроде следующего:

join <- full_join(a, b, by = c("a_ID" = "b_ID")) %>%
  filter(abs(a_DATE_MONTH - b_DATE_MONTH) <= 1)

Этот подход все еще дает те же записи в ваших окончательных результатах.

Он работает хуже / медленнее, если R выполняет полное полное соединение до делать любую фильтрацию. Тем не менее, dplyr разработан для использования отложенной оценки, что означает, что (если вы не сделаете что-то необычное) обе команды должны оцениваться вместе (как это было бы при более сложном SQL объединении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...