У меня есть два отдельных набора данных: df1 и df2. Я хотел бы создать новый набор данных, df3, который бы соответствовал столбцу конечного времени df1 с отправленным столбцом df2, если даты и время находятся в пределах 20 секунд друг от друга. Наконец, я хотел бы создать окончательный набор данных, который даст мне все значения в наборе данных df2 (отправленный / ID набор данных), которые не соответствуют df1.
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
Желаемый вывод для несопоставленных значений
sent
1/7/2020 1:42:00 AM
1/20/2020 1:55:00 AM
1/20/2020 2:00:00 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 (), но сложная часть сопоставляет значения с условным оператором. Любое предложение приветствуется.
df3<-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(sent, .keep_all = TRUE)
Это хорошо работает, но я не знаю, как найти все значения в наборе данных df2, которые по сути являются "оставшимися" и не имеют соответствия. Любое предложение приветствуется.