【发布时间】:2020-05-20 23:01:05
【问题描述】:
我有一个数据集,df
Read Box ID Time
T out 10/1/2019 9:00:01 AM
T out 10/1/2019 9:00:02 AM
T out 10/1/2019 9:00:03 AM
T out 10/1/2019 9:02:59 AM
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
T out 10/1/2019 9:06:02 AM
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
T out 10/1/2019 9:07:06 AM
hello 10/1/2019 9:07:08 AM
基于此数据集中的某些条件,我想创建一个 starttime 列和一个 endtime 列。 我想在发生以下情况时创建一个“开始时间”:Read == "T", Box == "out" and ID == "" 当这种情况的第一个实例发生时,将生成一个开始时间。例如对于这个数据集,开始时间将是 10/1/2019 9:00:01 AM,因为这是我们首先看到所需条件的地方(Read = T, Box = out and ID = "" ) 但是,当这些条件中的任何一个都不成立时,就会创建结束时间。因此,第一个结束时间将发生在第 6 行之前,其中时间是 2019 年 10 月 1 日上午 9:03:00。我的最终目标是为此创建一个持续时间列。
这是我想要的输出:
starttime endtime duration
10/01/2019 9:00:01 AM 10/01/2019 9:03:00 AM 179 secs
10/1/2019 9:06:00 AM 10/1/2019 9:06:02 AM 2 secs
10/1/2019 9:07:04 AM 10/1/2019 9:07:06 AM 2 secs
输入:
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")), class = "data.frame", row.names = c(NA,
-14L))
我认为总的来说,我必须创建一个循环。我相信我的思维过程是正确的,只是不确定如何制定代码。这就是我正在尝试的:
df2 <- mutate(df,
Date = lubridate::mdy_hms(Date))
for ( i in 2:nrow(df2))
{
if(df2$Read[[i]] == 'T')
}
我认为这可能是一个开始(只是将我的条件放在循环中,我不知道如何完成)
欢迎提出任何建议。
【问题讨论】: