С помощью data.table
, сгруппированного по идентификатору длины прогона 'group (rleid(group)
), получите значение first
' group 'и количество наблюдений (.N
), затем сгруппируйте по' group', paste
последовательность наблюдений с помощью' group ', скопируйте ее на количество наблюдений после order
ing с помощью' ind 'и назначьте их для создания' subgroup2 '
library(data.table)
sgrp <- setDT(df1)[, .(group = first(group), n = .N),
.(ind = rleid(group))][, .(paste(group, seq_len(.N), sep="."), n, ind),
group][order(ind), rep(V1, n)]
df1[, subgroup2 := sgrp]
df1
# value group subgrouping subgroup2
# 1: 1 a a.1 a.1
# 2: 5 a a.1 a.1
# 3: 2 a a.1 a.1
# 4: 3 b b.1 b.1
# 5: 2 b b.1 b.1
# 6: 5 b b.1 b.1
# 7: 2 b b.1 b.1
# 8: 1 b b.1 b.1
# 9: 3 b b.1 b.1
#10: 2 a a.2 a.2
#11: 5 a a.2 a.2
#12: 5 a a.2 a.2
#13: 6 a a.2 a.2
#14: 6 a a.2 a.2
#15: 2 a a.2 a.2
#16: 1 a a.2 a.2
#17: 0 c c.1 c.1
#18: 3 c c.1 c.1
#19: 3 c c.1 c.1
#20: 2 b b.2 b.2
#21: 1 b b.2 b.2
#22: 3 a a.3 a.3
#23: 2 b b.3 b.3
#24: 3 b b.3 b.3