Вот решение с использованием data.table::rleid
и dplyr
.При этом используется кодирование длины серии, чтобы сначала создать переменную группировки на основе Sailing.Port
(ID1
).Для каждой группы установите индикатор на 1, если это вторая половина «ПОРТА», и 0 в противном случае (ID2
).Используя этот индикатор, замените ID1
другой переменной группировки rle и сгенерируйте TRACKID
с cumsum
:
library(dplyr)
library(data.table)
df %>%
group_by(ID1 = rleid(Sailing.Port)) %>%
mutate(ID2 = if_else((row_number() > n()/2) & Sailing.Port == "PORT", 1, 0)) %>%
ungroup() %>%
group_by(ID1 = rleid(ID2)) %>%
mutate(ID3 = if_else(ID2 == 1 & row_number() == 1, 1, 0)) %>%
ungroup() %>%
mutate(TRACKID = cumsum(ID3)+1) %>%
select(-ID1, -ID2, -ID3)
Выход:
# A tibble: 16 x 3
Date Sailing.Port TRACKID
<fct> <fct> <dbl>
1 01.02.2016 SAILING 1
2 02.02.2016 SAILING 1
3 03.02.2016 SAILING 1
4 04.02.2016 SAILING 1
5 05.02.2016 SAILING 1
6 06.02.2016 PORT 1
7 07.02.2016 PORT 1
8 08.02.2016 PORT 2
9 09.02.2016 PORT 2
10 10.02.2016 SAILING 2
11 11.02.2016 SAILING 2
12 12.02.2016 SAILING 2
13 13.02.2016 SAILING 2
14 14.02.2016 PORT 2
15 15.02.2016 PORT 3
16 16.02.2016 SAILING 3
Данные:
df <- structure(list(Date = structure(1:16, .Label = c("01.02.2016",
"02.02.2016", "03.02.2016", "04.02.2016", "05.02.2016", "06.02.2016",
"07.02.2016", "08.02.2016", "09.02.2016", "10.02.2016", "11.02.2016",
"12.02.2016", "13.02.2016", "14.02.2016", "15.02.2016", "16.02.2016"
), class = "factor"), Sailing.Port = structure(c(2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L), .Label = c("PORT",
"SAILING"), class = "factor")), .Names = c("Date", "Sailing.Port"
), class = "data.frame", row.names = c(NA, -16L))