У меня есть набор данных, df:
В конечном итоге я хотел бы иметь возможность сгруппировать данные в «чанки», где в столбце «Папка» содержится строка «Out», с учетом DATE и пустые значения сообщений, с которыми оно связано. Есть ли способ создать чанк для каждого экземпляра, который 'Out' и пустая строка сообщения происходит, вычисляя его продолжительность.
Folder DATE Message
Outdata 9/9/2019 5:46:00
Outdata 9/9/2019 5:46:01
Outdata 9/9/2019 5:46:02
In 9/9/2019 5:46:03 hello
In 9/9/2019 5:46:04 hello
Outdata 9/10/2019 6:00:01
Outdata 9/10/2019 6:00:02
In 9/11/2019 7:50:00 hello
In 9/11/2019 7:50:01 hello
Я хотел бы этот вывод:
New Variable Duration Message
Outdata1 2 sec
Outdata2 1 sec
Я включил dput:
dput(sample)
structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L,
1L, 1L), .Label = c("In", "Outdata"), class = "factor"), Date = structure(c(5L,
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L), .Label = c("9/10/2019 6:00:01 AM",
"9/10/2019 6:00:02 AM", "9/11/2019 7:50:00 AM", "9/11/2019 7:50:01 AM",
"9/9/2019 5:46:00 AM", "9/9/2019 5:46:01 AM", "9/9/2019 5:46:02 AM",
"9/9/2019 5:46:03 AM", "9/9/2019 5:46:04 AM"), class = "factor"),
Message = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("",
"hello"), class = "factor")), class = "data.frame", row.names = c(NA,
-9L))
Это то, что я попробовал, и это хорошо работает, мне просто нужно учитывать состояние пустых значений сообщения.
library(dplyr)
df %>%
mutate(DATE = as.POSIXct(DATE, format = "%m/%d/%Y %I:%M:%S %p"),
gr = cumsum(Folder != lag(Folder, default = TRUE))) %>%
filter(Folder == "Out") %>%
arrange(gr, DATE) %>%
group_by(gr) %>%
summarise(Duration = difftime(last(DATE), first(DATE), units = "secs")) %>%
mutate(gr = paste0('Out', row_number()))
Приведенный выше код работает нормально, но я не уверен, как выполнить условие, где row == ""