[R] Faster way to transform vector [3 8 4 6 1 5] to [2 6 3 5 1 4]

2014-04-26 Thread xmliu1...@gmail.com
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 100, it takes too much time.
Is there any faster way to fix it?

best
Xueming



xmliu1...@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.


Re: [R] Faster way to transform vector [3 8 4 6 1 5] to [2 6 3 5 1 4]

2014-04-28 Thread xmliu1...@gmail.com

Thanks for your kind replies 

Jorge's answer helps.

warm wishes
Xueming




xmliu1...@gmail.com

From: Jorge I Velez
Date: 2014-04-26 23:41
To: xmliu1...@gmail.com
CC: r-help
Subject: Re: [R] Faster way to transform vector [3 8 4 6 1 5] to [2 6 3 5 1 4]
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, xmliu1...@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 100, it takes too much time.
Is there any faster way to fix it?

best
Xueming



xmliu1...@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]]

__
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.