z
以下のような数値要素があります。
> sort(z)
[1] 1 5 5 5 6 6 7 7 7 7 7 9 9
この要素を順次再編成して、
> z
[1] 1 2 2 2 3 3 4 4 4 4 4 5 5
z を因数に変換し、それをインデックスとして使用する方法が必要だと思います。
あなたは本当に自分で答えました:
as.integer(factor(sort(z)))
これはすでに受け入れられていることは知っていますが、内部factor()
を見て、そこでどのように行われているかを確認することにしました. 多かれ少なかれこれに帰着します:
x <- sort(z)
match(x, unique(x))
これは余分な行だと思いますが、それが重要な場合はより高速になるはずです。
これでうまくいくはずです
z = sort(sample(1:10, 100, replace = TRUE))
cumsum(diff(z)) + 1
[1] 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
[26] 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6
[51] 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
[76] 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10
diff
シリーズの最初の要素が省略されていることに注意してください。したがって、補償するには:
c(1, cumsum(diff(z)) + 1)
代替使用rle
:
z = sort(sample(1:10, 100, replace = TRUE))
rle_result = rle(sort(z))
rep(rle_result$values, rle_result$lengths)
> rep(rle_result$values, rle_result$lengths)
[1] 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3
[26] 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6
[51] 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8
[76] 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10