У меня есть набор данных, df
Read Box ID Time Subject
T out 10/1/2019 9:00:01 AM
T out 10/1/2019 9:00:02 AM Re:
T out 10/1/2019 9:00:03 AM Re:
T out 10/1/2019 9:02:59 AM Re:
T out 10/1/2019 9:03:00 AM
F 10/1/2019 9:05:00 AM
T out 10/1/2019 9:06:00 AM Fwd:
T out 10/1/2019 9:06:02 AM Fwd:
T in 10/1/2019 9:07:00 AM
T in 10/1/2019 9:07:02 AM
T out 10/1/2019 9:07:04 AM
T out 10/1/2019 9:07:05 AM Fw:
T out 10/1/2019 9:07:06 AM Fw:
hello 10/1/2019 9:07:08 AM
На основании определенных условий в этом наборе данных я хотел бы создать столбец звездного времени и столбец конечного времени.
Я хотел бы создать «время начала», когда происходит следующее: если первое слово столбцов темы начинается с RE :, re, FWD или FW (последовательно), Read == "T", Box == "out" и ID == ""
При возникновении первого экземпляра этого условия будет сгенерировано время запуска. Например, для этого набора данных начальное время будет 01.10.2009 9:00:02, так как именно здесь мы видим, что желаемые условия выполняются первыми (субъект - FW :, RE: или FWD, Read = T, Box = out and ID = "") Однако в тот момент, когда любое из этих условий не выполняется, будет создано конечное время. Таким образом, первый конечный момент наступит прямо перед 4-й строкой, где время 1.10.2009 9:02:59. Моя конечная цель состоит в том, чтобы затем создать столбец продолжительности для этого.
Это мой желаемый вывод при включении RE, Fwd и Fw
starttime endtime duration
10/1/2019 9:00:02 AM 10/1/2019 9:02:59 AM 177 secs
10/1/2019 9:06:00 AM 10/1/2019 9:06:02 AM 2 secs
10/1/2019 9:07:05 AM 10/1/2019 9:07:06 AM 1 secs
Кроме того, как бы я указал в отдельном код для создания начального и конечного времени для следующих условий: Read = T, Box = out, ID = "" и когда первое слово в столбце темы не содержит Re, Fwd или Fw?
Read Box ID Time Subject
T out 10/1/2019 9:00:01 AM
T out 10/1/2019 9:00:02 AM Re:
T out 10/1/2019 9:00:03 AM Re:
T out 10/1/2019 9:02:59 AM Re:
T out 10/1/2019 9:03:00 AM
F 10/1/2019 9:05:00 AM
T out 10/1/2019 9:06:00 AM Fwd:
T out 10/1/2019 9:06:02 AM Fwd:
T in 10/1/2019 9:07:00 AM
T in 10/1/2019 9:07:02 AM
T out 10/1/2019 9:07:04 AM
T out 10/1/2019 9:07:05 AM Fw:
T out 10/1/2019 9:07:06 AM Fw:
hello 10/1/2019 9:07:08 AM
Это мой желаемый вывод при исключении RE, Fwd и Fw
starttime endtime duration
10/1/2019 9:00:01 AM 10/1/2019 9:00:01 AM 0 secs
10/1/2019 9:03:00 AM 10/1/2019 9:03:00 AM 0 secs
10/1/2019 9:07:04 AM 10/1/2019 9:07:04 AM 0 secs
dput:
structure(list(Read = structure(c(3L, 3L, 3L, 3L, 3L, 2L, 3L,
3L, 3L, 3L, 4L, 4L, 3L, 1L), .Label = c("", "F", "T", "T "), class = "factor"),
Box = structure(c(3L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 2L, 2L,
3L, 3L, 3L, 1L), .Label = c("", "in", "out"), class = "factor"),
ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L), .Label = c("", "hello"), class = "factor"),
Time = structure(1:14, .Label = c("10/1/2019 9:00:01 AM",
"10/1/2019 9:00:02 AM", "10/1/2019 9:00:03 AM", "10/1/2019 9:02:59 AM",
"10/1/2019 9:03:00 AM", "10/1/2019 9:05:00 AM", "10/1/2019 9:06:00 AM",
"10/1/2019 9:06:02 AM", "10/1/2019 9:07:00 AM", "10/1/2019 9:07:02 AM",
"10/1/2019 9:07:04 AM", "10/1/2019 9:07:05 AM", "10/1/2019 9:07:06 AM",
"10/1/2019 9:07:08 AM"), class = "factor"), Subject = structure(c(1L,
4L, 4L, 4L, 1L, 1L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 1L), .Label = c("",
"Fw:", "Fwd:", "Re:"), class = "factor")), class = "data.frame", row.names = c(NA,
-14L))
Код, который был предложен, работает, я просто хотел бы также включить Условия столбца темы также:
Где Subject == FW, FWD, RE (игнорировать верхний / нижний регистр) и Где Subject не равен FW, FWD, Re (игнорировать верхний / нижний регистр)
library(dplyr)
df %>%
mutate(Time = lubridate::mdy_hms(Time),
cond = Read == "T" & Box == "out" & ID == "" & Subject == "FW" & Subject == "FWD" & Subject == "RE" (ignore.case = TRUE)
grp = cumsum(!cond)) %>%
filter(cond) %>%
group_by(grp) %>%
summarise(starttime = first(Time),
endtime = last(Time),
duration = difftime(endtime, starttime, units = "secs")) %>%
select(-grp)
библиотека (dplyr)
df %>%
mutate(Time = lubridate::mdy_hms(Time),
cond = Read == "T" & Box == "out" & ID == "" & Subject! == "FW" & Subject! == "FWD" & Subject! == "RE" (ignore.case = TRUE)
grp = cumsum(!cond)) %>%
filter(cond) %>%
group_by(grp) %>%
summarise(starttime = first(Time),
endtime = last(Time),
duration = difftime(endtime, starttime, units = "secs")) %>%
select(-grp)