Это основано на идентификаторе кодирования длины серии, который предполагает, что уникальные комбинации появляются только в чанках, а не в отдельных строках.
library(dplyr)
library(data.table)
dat2 <- dat %>%
group_by(study) %>%
mutate(grp =rleid(n1i)) %>%
mutate(grp = LETTERS[grp]) %>%
ungroup()
dat2
# # A tibble: 9 x 3
# study n1i grp
# <fct> <dbl> <chr>
# 1 a 25 A
# 2 a 25 A
# 3 a 22 B
# 4 d 38 A
# 5 d 50 B
# 6 d 30 C
# 7 d 30 C
# 8 j 50 A
# 9 j 50 A
Это решение может быть не идеальным.Например, если фрейм данных выглядит следующим образом:
study n1i
a 25
a 22
a 25
Кодировка длины прогона станет 1, 2, 3
.В этом случае вы можете сначала заказать свой фрейм данных, чтобы создать одну и ту же строку в одном и том же фрагменте.Я не разместил заказ или не организовал вызов в своем решении, потому что я не знаю, нужно ли переупорядочивать строки.
ОБНОВЛЕНИЕ
АнтониосК прокомментировал, что первыйтри строки должны быть A, A, C
.Я добавил min_rank
к операции pipe, чтобы учесть это утверждение.
dat2 <- dat %>%
group_by(study) %>%
mutate(grp =rleid(n1i)) %>%
mutate(grp = min_rank(grp)) %>%
mutate(grp = LETTERS[grp]) %>%
ungroup()
dat2
# # A tibble: 9 x 3
# study n1i grp
# <fct> <dbl> <chr>
# 1 a 25 A
# 2 a 25 A
# 3 a 22 C
# 4 d 38 A
# 5 d 50 B
# 6 d 30 C
# 7 d 30 C
# 8 j 50 A
# 9 j 50 A