Мутировать (dplyr) на основе нескольких условий (временных интервалов) - PullRequest
0 голосов
/ 24 августа 2018

Я борюсь с условным объединением двух наборов данных, которые у меня есть.

Первый имеет следующую структуру

 ID   Trip number       Time start             Time Stop       
  1        1        2018-04-10 14:44:38   2018-04-10 14:44:38  
  1        2        2018-04-10 16:28:08   2018-04-10 16:46:17  
  2        1        2018-04-10 22:47:56   2018-04-10 23:26:24  

Второй имеет такую ​​

 ID   Status          Time             
  1       a        2018-04-10 14:44:38     
  1       b        2018-04-10 16:28:08     
  2       c        2018-04-10 22:47:56     

Я пытаюсь создать новый столбец для первого df1то, что содержит минимальное время для каждого идентификатора, найденного во втором df2, которое лежит в интервале между временем начала и окончания каждой поездки идентификатора.Также я добавил 900 сек для интервала, чтобы сделать его шире.

Пока мой код выглядит так:

try <- df1 %>%
  group_by(ID, Trip.number)  %>%
  mutate(ifelse((df1$Time.Start - 900) >= df2$Time & (df1$Time.Stop + 900) <= df2$Time & df1$ID %in% df2$ID), df2$Time, 0) 

В завершение выдается предупреждение (длина двух наборов данных различна)

Ошибка оценки: аргумент "нет "отсутствует, без по умолчанию.Кроме того: Предупреждающие сообщения:
1: In >=.default (df1 $ Time.Start - 900, df2 $ Time): длинная длина объекта не кратна короткой длине объекта
2: In <=.default (df1 $ Time.Start + 900, df2 $ Time): длинная длина объекта не кратна короткой длине объекта

Время преобразуется в POSIXct

Воспроизводимый пример

df1 <- data.table(ID = c(1,1,1,2,2,3,3,3,4,5,5,5),
             Trip.number = c(1,2,3,1,2,1,2,3,1,1,2,3), 
             Time.start = as.POSIXct(c("2018-04-10 14:44:38", "2018-04-10 16:28:08", 
                                       "2018-04-10 17:31:54", "2018-04-10 13:29:33", 
                                       "2018-04-10 22:47:56", "2018-04-10 10:03:15", 
                                       "2018-04-10 18:00:23", "2018-04-10 19:56:04", 
                                       "2018-04-10 08:52:00", "2018-04-10 09:54:50", 
                                       "2018-04-10 14:51:04", "2018-04-10 18:34:01")),
             Time.stop = as.POSIXct(c("2018-04-10 15:30:59","2018-04-10 16:46:17",
                                      "2018-04-10 18:03:36", "2018-04-10 13:52:35",
                                      "2018-04-10 23:26:24", "2018-04-10 10:39:23",
                                      "2018-04-10 18:03:37", "2018-04-10 20:29:13",
                                      "2018-04-10 09:05:08", "2018-04-10 10:31:54",
                                      "2018-04-10 15:00:41", "2018-04-10 19:04:10")))

df2 <- data.table(ID=c(1,1,2,2,2,2,4,5,6,7,8,9),
              Time =  as.POSIXct(c("2018-04-10 18:34:01",
                                   "2018-04-10 19:04:10",
                                   "2018-04-10 12:07:35",
                                   "2018-04-10 12:13:59",
                                   "2018-04-10 11:06:00",
                                   "2018-04-10 11:46:20",
                                   "2018-04-10 18:56:51",
                                   "2018-04-10 19:10:03",
                                   "2018-04-10 09:06:06",
                                   "2018-04-10 09:29:04",
                                   "2018-04-10 18:04:47",
                                   "2018-04-10 18:21:24")))

Заранее спасибо!

1 Ответ

0 голосов
/ 24 августа 2018

Небольшой выборочный набор данных был бы полезен, но я думаю, что вам просто нужно круглые скобки вокруг операций

mutate(ifelse( (df1$Time.Start - 900) >= df2$Time & (df1$Time.Stop + 900) <= df2$Time & df1$ID %in% df2$ID), df2$Time, 0)
...