[R] A More efficient method?

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jul 4 18:45:37 CEST 2007


In thinking about this a bit more I have found a slightly faster one still.
See s3.  Also I have added s0, the original solution, to the timings.

> set.seed(1)
> C <- sample(c("a", "b"), 1000000, replace = TRUE)
> system.time({
+ s0 <- vector(length = length(C))
+ for(i in seq_along(C)) s0[i] <- if (C[i] == "a") 1 else -1
+ s0
+ })
   user  system elapsed
  21.75    0.02   25.99
> system.time(s1 <- ifelse(C == "a", 1, -1))
   user  system elapsed
   2.32    0.17    2.54
> system.time(s2 <- 2 * (C == "a") - 1)
   user  system elapsed
   0.29    0.02    0.32
> system.time({tmp <- C == "a"; tmp - !tmp})
   user  system elapsed
   0.21    0.00    0.21
> identical(s0, s1)
[1] TRUE
> identical(s0, s2)
[1] TRUE
> identical(s0, s3)
[1] TRUE

On 7/4/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> Here are two ways.  The second way is more than 10x faster.
>
> > set.seed(1)
> > C <- sample(c("a", "b"), 100000, replace = TRUE)
> > system.time(s1 <- ifelse(C == "a", 1, -1))
>   user  system elapsed
>   0.37    0.01    0.38
> > system.time(s2 <- 2 * (C == "a") - 1)
>   user  system elapsed
>   0.02    0.00    0.02
> > identical(s1, s2)
> [1] TRUE
>
> On 7/4/07, Keith Alan Chamberlain <Keith.Chamberlain at colorado.edu> wrote:
> > Dear Rhelpers,
> >
> > Is there a faster way than below to set a vector based on values from
> > another vector? I'd like to call a pre-existing function for this, but one
> > which can also handle an arbitrarily large number of categories. Any ideas?
> >
> > Cat=c('a','a','a','b','b','b','a','a','b')      # Categorical variable
> > C1=vector(length=length(Cat))   # New vector for numeric values
> >
> > # Cycle through each column and set C1 to corresponding value of Cat.
> > for(i in 1:length(C1)){
> >        if(Cat[i]=='a') C1[i]=-1 else C1[i]=1
> > }
> >
> > C1
> > [1] -1 -1 -1  1  1  1 -1 -1  1
> > Cat
> > [1] "a" "a" "a" "b" "b" "b" "a" "a" "b"
> >
> > Sincerely,
> > KeithC.
> > Psych Undergrad, CU Boulder (US)
> > RE McNair Scholar
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch 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.
> >
>



More information about the R-help mailing list