按顺序重新组织R中的向量

时间:2013-04-05 12:26:56

标签: r sorting vector

我有一个数字元素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 个答案:

答案 0 :(得分:8)

你自己回答了:

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

我知道这已经被接受但我决定在factor()内查看它是如何完成的。它或多或少归结为:

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

我认为这是一条额外的行,但如果重要的话应该更快。

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分:0)

rep(seq_along(rle(x)$l), rle(x)$l)