Согласно комментарию OP , строки расположены по порядку.
Тогда, вот два разных подхода, которые также будут обрабатывать случай "пятница, суббота, воскресенье" (dayweek
6, 7, 1), упомянутый в комментариях.
rleid()
fct_inorder()
rleid()
Используется функция rleid()
из пакета data.table
:
library(dplyr)
df2 %>%
group_by(id) %>%
mutate(daynum2 = data.table::rleid(dayweek))
id dayweek daynum daynum2
<dbl> <dbl> <dbl> <int>
1 1 1 1 1
2 1 1 1 1
3 1 4 2 2
4 1 4 2 2
5 1 5 3 3
6 1 5 3 3
7 2 1 1 1
8 2 1 1 1
9 2 2 2 2
10 2 2 2 2
11 2 3 3 3
12 2 3 3 3
13 2 3 3 3
14 3 6 1 1
15 3 7 2 2
16 3 1 3 3
Обратите внимание, что используется расширенный набор данных, который также охватывает случай "пятница, суббота, воскресенье" (dayweek
6, 7, 1).
fct_inorder()
Это расширенная версия ответа Ронака , в котором также рассматривается случай "пятница, суббота, воскресенье". Он использует fct_inorder()
из пакета forcats
, который переупорядочивает уровни факторов при первом появлении.
df2 %>%
group_by(id) %>%
mutate(daynum2 =
dayweek %>%
as.character() %>%
forcats::fct_inorder() %>%
as.integer()
)
Вывод такой же, как указано выше.
Данные
Это расширенный набор данных, который включает также случай «пятница, суббота, воскресенье» (dayweek
6, 7, 1):
df2 <- data.frame(
id = c(rep(1:2, each = 6), 2, rep(3, 3)),
dayweek = c(rep(c(1, 4, 5), each = 2),rep(c(1, 2, 3), each = 2), 3, 6, 7, 1),
daynum = c(rep(1:3, each = 2, times = 2), 3, 1:3)
)