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

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个回答

8

你已经自己回答了这个问题:


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

我知道这个已经被接受了,但我决定查看 factor() 的内部实现。大致上可以归结为以下内容:

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

我想这是多余的一行,但如果有必要的话,它应该会更快。


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)

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接