Hi Xueming,

Try

(1:length(bo))[rank(bo)]

In a function the above would be

f <- function(x){
      N <- length(x)
      (1:N)[rank(x)]
}
f(bo)
# [1] 2 6 3 5 1 4

HTH,
Jorge.-




On Sat, Apr 26, 2014 at 7:54 PM, xmliu1988@gmail.com <xmliu1988@gmail.com>wrote:

> Hi,
>
> could anybody help me to find a fast way to fix the following question?
>
> Given a verctor of length N, for example bo = [3  8  4  6  1  5],
> I want to drive a vector whose elements are 1, 2, ..., N and the order of
> elements is the same as that in verctor bo.
> In this example, the result is supposed to be bt = [2  6  3  5  1 4].
>
> I used the following code to solove this:
>
> bo <- c(3,  8,  4,  6,  1,  5)
> N <- length(bo)
> bt <- rep(0, N)
> M <- max(bo)
> temp <- bo
>   for(i in 1 : N)
>             {
>                 min <- M
>                 i_min <- 0
>
>                 for(j in 1 : N)
>                 {
>                     if(min >= temp[j])
>                     {
>                           min <- temp[j]
>                           i_min <-j
>                      }
>                 }
>                 bt[i_min] <- i
>                 temp[i_min] <- M+ 1
>              }
> > bt
> [1] 2 6 3 5 1 4
>
> However, the time complexity is O(N2).
> When N is larger than 1000000, it takes too much time.
> Is there any faster way to fix it?
>
> best
> Xueming
>
>
>
> xmliu1988@gmail.com
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]


