Поскольку ваш вопрос все еще немного размыт, я попытаюсь показать вам, как, по моему мнению, вы могли бы сделать это более R-подобным образом.
Вот начальный кадр данныхиз того, что вы указали:
library(tidyverse)
library(stringr)
df1 <- structure(list(V1 = 1:23, V2 = c(1316.1, 0.2, 131.6, 0.5, 49.6,
0.5, 183.1, 0.2, 1307.1, 0.2, 2.1, 12.1, 8.1, 649.1, 0.2, 503.6,
0.5, 231.1, 0.2, 2527.6, 0.5, 90.1, 0.2)), class = "data.frame", row.names = c(NA,
-23L))
Сначала давайте пометим каждый запуск тайм-аута, а затем создадим переменную группировки, которая группирует каждый раз при запуске нового тайм-аута:
df1 <- df1 %>% mutate(V3 = ifelse(grepl("\\.2$", V2), TRUE, FALSE),
TimeOutGroup = cumsum(V3))
Далее,давайте вытянем компонент секунд из V2
в его собственный столбец и вычислим время, прошедшее в каждой группе.
df1 <- df1 %>% group_by(TimeOutGroup ) %>%
mutate(Seconds = as.numeric(gsub("(^\\d+)?\\..*", "\\1",V2))/100,
Time_Elapsed = cumsum(Seconds))
Дает нам следующее:
# A tibble: 23 x 6
# Groups: TimeOutGroup [7]
V1 V2 V3 TimeOutGroup Seconds Time_Elapsed
<int> <dbl> <lgl> <int> <dbl> <dbl>
1 1 1316. FALSE 0 13.2 13.2
2 2 0.2 TRUE 1 0 0
3 3 132. FALSE 1 1.31 1.31
4 4 0.5 FALSE 1 0 1.31
5 5 49.6 FALSE 1 0.49 1.8
6 6 0.5 FALSE 1 0 1.8
7 7 183. FALSE 1 1.83 3.63
8 8 0.2 TRUE 2 0 0
9 9 1307. FALSE 2 13.1 13.1
10 10 0.2 TRUE 3 0 0
Теперь нам нужноподумать о том, каково наше условие окончания времени ожидания, и действительно ли оно должно быть отдельной строкой.
Мы можем определить End как любую строку, в которой общее время, прошедшее с начала> 10, илигде следующее значение равно NA
(что означает отсутствие последующих значений до нового запуска).И затем мы можем добавить Start в этот столбец:
df1 %>% mutate(Status = ifelse(Time_Elapsed > 10 | is.na(lead(Time_Elapsed)), "End", ""),
Status = ifelse(V3 == TRUE, "Start", Status))
Это дает нам такую таблицу, где мы пометили Start и End, без добавления каких-либо строк:
# A tibble: 23 x 7
# Groups: TimeOutGroup [7]
V1 V2 V3 TimeOutGroup Seconds Time_Elapsed Status
<int> <dbl> <lgl> <int> <dbl> <dbl> <chr>
1 1 1316. FALSE 0 13.2 13.2 End
2 2 0.2 TRUE 1 0 0 Start
3 3 132. FALSE 1 1.31 1.31 ""
4 4 0.5 FALSE 1 0 1.31 ""
5 5 49.6 FALSE 1 0.49 1.8 ""
6 6 0.5 FALSE 1 0 1.8 ""
7 7 183. FALSE 1 1.83 3.63 End
8 8 0.2 TRUE 2 0 0 Start
9 9 1307. FALSE 2 13.1 13.1 End
10 10 0.2 TRUE 3 0 0 Start
Надеюсь, это полезно!