Вот вариант, где мы группируем по 'ID' и match
'Сеанс' с unique
элементами 'Сеанса', чтобы получить индекс
library(dplyr)
Session_numbers %>%
group_by(ID) %>%
mutate(num = match(Session, unique(Session)))
# A tibble: 10 x 3
# Groups: ID [2]
# ID Session num
# <int> <chr> <int>
# 1 1 1_43392 1
# 2 1 1_43392 1
# 3 1 1_43392 1
# 4 1 1_43394 2
# 5 1 1_43394 2
# 6 1 1_43394 2
# 7 1 1_43398 3
# 8 1 1_43401 4
# 9 2 2_44502 1
#10 2 2_44502 1
Или используя base R
Session_numbers$num <- with(Session_numbers, ave(Session, ID, FUN =
function(x) match(x, unique(x))))
Если мы заинтересованы в замене несмежных элементов на новый номер, то
library(data.table)
...
%>% mutate(num = rleid(Session))
data
Session_numbers <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L),
Session = c("1_43392", "1_43392", "1_43392", "1_43394", "1_43394",
"1_43394", "1_43398", "1_43401", "2_44502", "2_44502")),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))