#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