Объединение двух наборов данных на основе определенных условий при сохранении указанных столбцов c - PullRequest
0 голосов
/ 05 марта 2020

Цель

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

  df1 

  End                           Duration

  1/22/2020 5:42:13 AM          34
  1/30/2020 12:12:50 AM          5


  df2

  Sent

  1/22/2020 5:42:20 AM
  1/31/2020 12:00:00 PM

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

  End                                 Sent                       Duration


  1/22/2020 5:42:13 AM               1/22/2020 5:42:20 AM        34

Выход:

 df1


 structure(list(End = structure(1:2, .Label = c("1/22/2020 5:42:13 AM", 
 "1/30/2020 12:12:50 AM"), class = "factor"), Duration = c(34L, 
 5L)), class = "data.frame", row.names = c(NA, -2L))


df2

structure(list(Sent = structure(1:2, .Label = c("1/22/2020 5:42:20 AM", 
"1/31/2020 12:00:00 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))

То, что я пробовал

df3<-crossing(endtime = as.POSIXct(df1$End,format ="%m/%d/%Y %I:%M:%S %p" ), 
SentTime = as.POSIXct(df2$Sent, format = "%m/%d/%Y %I:%M:%S %p")) %>% 
filter((endtime - seconds(20)) <= SentTime, 
      (endtime + seconds(20)) >= (SentTime)) %>%
mutate_all(format, format = "%m/%d/%Y %I:%M:%S %p") %>%
distinct(SentTime, .keep_all = TRUE)

Приведенный выше код хорошо совпадает с датой и временем в течение 20 секунд, однако соответствующий столбец длительности отсутствует. Как можно сопоставить эти наборы данных, если они находятся в пределах 20 секунд друг от друга, при этом сохраняя соответствующий столбец Продолжительность?

Любое предложение приветствуется.

1 Ответ

1 голос
/ 05 марта 2020

Мы можем создать все возможные комбинации с crossing, изменить столбцы на формат POSIXct и выбрать только те строки, в которых разница между End и Sent составляет менее 20 секунд.

library(dplyr)

tidyr::crossing(df1, df2) %>%
  mutate_at(vars(End, Sent), lubridate::mdy_hms) %>%
  filter(abs(as.numeric(difftime(End, Sent, "seconds"))) < 20)

# A tibble: 1 x 3
#  End                 Duration Sent               
#  <dttm>                 <int> <dttm>             
#1 2020-01-22 05:42:13       34 2020-01-22 05:42:20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...