我有一个数字元素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转换为一个因子并将其用作索引应该是这样的。
答案 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)