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

#r #dplyr

#r #dplyr

Вопрос:

У меня есть одна таблица, содержащая данные о времени простоя, которая выглядит следующим образом

 | Machine No | Start Time       | End Time         |
|------------|------------------|------------------|
| H18        | 01-01-2021 12:05 | 01-01-2021 12:15 |
| H19        | 02-01-2021 11:15 | 02-01-2021 13:15 |
| H20        | 01-01-2021 11:15 | 01-01-2021 13:15 |
| H21        | 02-01-2021 09:15 | 02-01-2021 13:55 |
| H22        | 02-01-2021 10:25 | 02-01-2021 10:35 |
 

И у меня есть данные потока создания ценности, которые выглядят следующим образом, которые в основном добавляются ко всем машинам вместе

 | Machine No | timestamp        | Value |
|------------|------------------|-------|
| H18        | 01-01-2021 12:00 | 34    |
| H18        | 01-01-2021 12:01 | 74    |
| H18        | 01-01-2021 12:02 | 43    |
| H18        | 01-01-2021 12:03 | 60    |
| H18        | 01-01-2021 12:04 | 68    |
| H18        | 01-01-2021 12:05 | 17    |
| H18        | 01-01-2021 12:06 | 38    |
| H18        | 01-01-2021 12:07 | 91    |
| H18        | 01-01-2021 12:08 | 65    |
| H18        | 01-01-2021 12:09 | 80    |
| H18        | 01-01-2021 12:10 | 67    |
| H18        | 01-01-2021 12:11 | 78    |
| H18        | 01-01-2021 12:12 | 43    |
| H18        | 01-01-2021 12:13 | 53    |
| H18        | 01-01-2021 12:14 | 92    |
| H18        | 01-01-2021 12:15 | 11    |
| H18        | 01-01-2021 12:16 | 75    |
| H18        | 01-01-2021 12:17 | 61    |
| H18        | 01-01-2021 12:18 | 82    |
| H18        | 01-01-2021 12:19 | 50    |
| H18        | 01-01-2021 12:20 | 65    |
| H18        | 01-01-2021 12:21 | 23    |
| H18        | 01-01-2021 12:22 | 80    |
| H18        | 01-01-2021 12:23 | 55    |
| H18        | 01-01-2021 12:24 | 61    |
| H18        | 01-01-2021 12:25 | 11    |
| H18        | 01-01-2021 12:26 | 98    |
 

Я хочу удалить строки, содержащие данные, из таблицы потока создания ценности, которая находится между временем начала и временем окончания, указанным в таблице данных простоя. Как мне добиться этого в R?

Ответ №1:

Вы можете объединить df1 и df2 с помощью Machine.No , преобразовать столбцы в POSIXct формат и сохранить только те строки , которые находятся за пределами Start.Time и End.Time .

 library(dplyr)

df1 %>%
  inner_join(df2, by = 'Machine.No') %>%
  mutate(across(c(Start.Time,  End.Time,timestamp), lubridate::dmy_hm)) %>%
  filter(!(timestamp >= Start.Time amp; timestamp <= End.Time))
 

Или в базовом R :

 res <- merge(df1, df2, by = 'Machine.No')
res[2:4] <- lapply(res[2:4], as.POSIXct, format = '%d-%m-%Y %H:%M', tz = 'UTC')
subset(res, !(timestamp >= Start.Time amp; timestamp <= End.Time))
 

Комментарии:

1. Привет, Ронак, я не думаю, что это работает, поскольку то, что он делает, заключается в том, что 1 lacs строк в Valuestream и 10k строк в режиме простоя, при объединении с помощью inner join реплицируется примерно до 29lac. Наша цель — просто удалить данные потока создания ценности в пределах диапазона времени, указанного в таблице простоев, для каждой машины соответственно

2. Это может произойти, если df1 имеет дублирующийся номер машины. В этом примере у вас есть только 1 строка для каждого номера машины. Какое первое значение возвращается при выполнении df1 %>% count(Machine.No, sort = TRUE) %>% head