2013-04-05 51 views
3

我有如下数字元件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因子并用它作为索引应该是这样的。

回答

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)