3

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 を因数に変換し、それをインデックスとして使用する方法が必要だと思います。

4

4 に答える 4

8

あなたは本当に自分で答えました:

as.integer(factor(sort(z)))

これはすでに受け入れられていることは知っていますが、内部factor()を見て、そこでどのように行われているかを確認することにしました. 多かれ少なかれこれに帰着します:

x <- sort(z)
match(x, unique(x))

これは余分な行だと思いますが、それが重要な場合はより高速になるはずです。

于 2013-04-05T12:34:56.237 に答える
2

これでうまくいくはずです

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)
于 2013-04-05T12:32:57.923 に答える
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
于 2013-04-05T12:35:13.560 に答える