Объединить два набора данных с условием интервала времени в R (я хотел бы избежать комбинаций и просто иметь уникальные совпадения) - PullRequest
1 голос
/ 21 февраля 2020

У меня есть два отдельных набора данных: df1 и df2. Я хотел бы создать новый набор данных, df3, который бы соответствовал столбцу конечного времени df1 с отправленным столбцом df2, если даты и время находятся в пределах 20 секунд друг от друга.

 df1

 endtime                     ID

 1/7/2020  1:35:08 AM         A
 1/7/2020  1:39:00 AM         B
 1/20/2020 1:45:00 AM         C



 df2

sent                         ID

1/7/2020  1:35:20 AM          E
1/7/2020  1:42:00 AM          F
1/20/2020 1:55:00 AM          G
1/20/2020 2:00:00 AM          E

Это мой желаемый вывод для df3. Есть только одна строка, потому что есть только два значения, которые соответствуют условию нахождения в пределах 20 секунд от конечного времени и отправленных столбцов. Я хотел бы уникальные матчи, а не комбинации. По сути, слияние с условием времени.

endtime                  sent 

1/7/2020 1:35:08 AM      1/7/2020  1:35:20 AM       

Вот dput:

df1

structure(list(endtime = structure(c(2L, 3L, 1L), .Label = c("1/10/2020 1:45:00 AM", 
"1/7/2020 1:35:08 AM", "1/7/2020 1:39:00 AM"), class = "factor"), 
ID = structure(1:3, .Label = c("A", "B", "C"), class = "factor")), class = "data.frame", row.names =   c(NA, 
 -3L))





 df2

 structure(list(sent = structure(c(3L, 4L, 1L, 2L), .Label = c("1/20/2020 1:55:00 AM", 
 "1/20/2020 2:00:00 AM", "1/7/2020 1:35:20 AM", "1/7/2020 1:42:00 AM"
 ), class = "factor"), ID = structure(c(1L, 2L, 3L, 1L), .Label = c("E", 
"F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L))

Вот что я пробовал:

Я думаю о выполнении оставьте соединение и сопоставьте значения, или я могу использовать merge (), но сложная часть сопоставляет значения с условным оператором. Любое предложение приветствуется.

library(dplyr)
left_join(df1, df2)

1 Ответ

1 голос
/ 21 февраля 2020

Может быть, нам нужно сделать crossing, а затем filter после преобразования в DateTime class

library(dplyr)
library(tidyr)
library(lubridate)
crossing(endtime = as.POSIXct(df1$endtime,format ="%m/%d/%Y %I:%M:%S %p" ), 
           sent = as.POSIXct(df2$sent, format = "%m/%d/%Y %I:%M:%S %p")) %>% 
     filter((endtime - seconds(20)) <= sent, 
                 (endtime + seconds(20)) >= (sent)) %>%
     mutate_all(format, format = "%m/%d/%Y %I:%M:%S %p") %>%
     distinct
# A tibble: 1 x 2
#  endtime                sent                  
#  <chr>                  <chr>                 
#1 01/07/2020 01:35:08 AM 01/07/2020 01:35:20 AM
...