我如何有效地进行二分法

时间:2009-10-07 05:00:23

标签: r performance

是否有更多“有思想”的方式来有效地进行二分法?感谢。

y<-c(0,3,2,1,0,0,2,5,0,1,0,0);b<-vector()

for (k in 1:length(y)) {
    if (y[k] == 0) b[k] = 0
    else
        b[k] = 1
}
y;b

5 个答案:

答案 0 :(得分:6)

试试这个:

b <- rep(0, length(y))
b[y != 0] <- 1

这是有效的,因为y和b的大小相同,rep()非常快/矢量化。

编辑:这是另一种方法:

b <- ifelse(y == 0, 0, 1) 

ifelse()函数也是矢量化的。

答案 1 :(得分:5)

b <- as.numeric(y!=0)

答案 2 :(得分:2)

使用ifelse()。这是矢量化和(编辑:有点)快。

> y <- c(0,3,2,1,0,0,2,5,0,1,0,0)
> b <- ifelse(y == 0, 0, 1)
 [1] 0 1 1 1 0 0 1 1 0 1 0 0

编辑2: 这种方法不如as.numeric(y!= 0)方法快。

> t <- Sys.time(); b <- as.numeric(y!=0); Sys.time() - t # Rob's approach
Time difference of 0.0002379417 secs
> t <- Sys.time(); b <- ifelse(y==0, 0, 1); Sys.time() - t # Shane's 2nd and my approach
Time difference of 0.000428915 secs
> t <- Sys.time(); b = sapply( y, decider ); Sys.time() - t # James's approach
Time difference of 0.0004429817 sec

但对某些人而言,ifelse可能比as.numeric方法更具可读性。

注意OP的版本需要0.0004558563才能运行。

答案 3 :(得分:1)

 b<-(y!=0)+0

> b
 [1] 0 1 1 1 0 0 1 1 0 1 0 0

答案 4 :(得分:0)

你有一些有用的东西。你出于某种原因担心速度吗?这是另一种选择:

y<-c(0,3,2,1,0,0,2,5,0,1,0,0)

decider = function( x ) {
   if ( x == 0 ) {
      return(0)
   }

   return(1)
}

b = sapply( y, decider )