Один из способов:
unlist(lapply(split(x, x), seq_along))
, где x
- это ваш фактор как вектор.
R> x <- factor(rep(letters[1:3], times = c(5,5,4))) ## your data
R> data.frame(factor = x, index = unlist(lapply(split(x, x), seq_along),
+ use.names = FALSE))
factor index
1 a 1
2 a 2
3 a 3
4 a 4
5 a 5
6 b 1
7 b 2
8 b 3
9 b 4
10 b 5
11 c 1
12 c 2
13 c 3
14 c 4
Другой способ в аналогичной теме - использовать table()
иseq_len()
:
unlist(sapply(table(x), seq_len), use.names = FALSE)
И еще один способ - использовать кодировку длин серий через rle()
:
R> rle(as.character(x))$lengths
[1] 5 5 4
, которую мы можем вставить в код sapply()
вместоtable()
вызов:
R> unlist(sapply(rle(as.character(x))$lengths, seq_len), use.names = FALSE)
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4