我有如下數字元件z
:按順序重新組織中的R矢量
> 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到A因子並用它作爲索引應該是這樣的。
我有如下數字元件z
:按順序重新組織中的R矢量
> 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到A因子並用它作爲索引應該是這樣的。
你自己真的回答了這個問題:
as.integer(factor(sort(z)))
我知道這已經被接受,但我還是決定看看裏面factor()
,看看它是如何做在那裏。它或多或少歸結爲:
x <- sort(z)
match(x, unique(x))
這是一個額外的線我想,但它應該是更快,如果重要。
這應該做的伎倆
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)
使用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
rep(seq_along(rle(x)$l), rle(x)$l)