Выполнение левого соединения с точными значениями плюс ближайшие значения - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть два набора данных:

table1 <- data.frame(id=c(1000,1001,1002,1003), 
                    date=as.POSIXct(c("2012-05-13","2012-09-23","2011-04-09","2014-11-08"))) 

table2 <- data.frame(id2=c(1000,1000,1001,1002,1003,1003), 
                   date2=as.POSIXct(c("2012-05-13","2012-05-16","2012-09-24","2011-04-15","2014-11-09", "2014-11-10"))) 

Я хочу выполнить левое объединение таблицы 1 на основе совпадающих идентификатора и даты, однако не все даты имеют точное совпадение, поэтому мне было интересно, как я могу присоединитьсядаты на основе ближайшего дня?Например, для идентификатора 1001 «2012-09-23» будет соответствовать «2012-09-24» для id2 1001, поскольку это единственная дата для id2, а для 1003 «2014-11-08» будет соответствовать »2014-11-09 "из 1003 для id2, так как это самый близкий день.

Желаемый результат:

  id       date      date2
1 1000 2012-05-13 2012-05-13
2 1001 2012-09-23 2012-09-24
3 1002 2011-04-09 2011-04-15
4 1003 2014-11-08 2014-11-09

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я бы также порекомендовал вам следовать неуравновешенным data.table соединениям, но в случае, если вы по какой-то причине захотите придерживаться dplyr, и ваши данные не очень большие или у вас достаточно памяти,Вы также можете попробовать:

library(dplyr)

table1 %>%
  left_join(table2, by = c("id" = "id2")) %>%
  group_by(id) %>%
  slice(which.min(abs(date - date2)))

Вывод:

# A tibble: 4 x 3
# Groups:   id [4]
     id date                date2              
  <dbl> <dttm>              <dttm>             
1  1000 2012-05-13 00:00:00 2012-05-13 00:00:00
2  1001 2012-09-23 00:00:00 2012-09-24 00:00:00
3  1002 2011-04-09 00:00:00 2011-04-15 00:00:00
4  1003 2014-11-08 00:00:00 2014-11-09 00:00:00
0 голосов
/ 26 февраля 2019

Используйте data.table для выполнения скользящего соединения с ближайшим значением.DT1 обновляется по ссылке, поэтому он будет очень быстрым, даже для больших / больших данных

library(data.table)

пример данных

dt1 <- as.data.table(table1)
dt2 <- as.data.table(table2)

код

dt1[, date2 := dt2[dt1, date2, on = c("id2 == id", "date2 == date"), roll = "nearest"]][]

выход

#      id       date      date2
# 1: 1000 2012-05-13 2012-05-13
# 2: 1001 2012-09-23 2012-09-23
# 3: 1002 2011-04-09 2011-04-09
# 4: 1003 2014-11-08 2014-11-08
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...