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 回答
0
rep(seq_along(rle(x)$l), rle(x)$l)
于 2013-04-05T13:24:33.007 回答