是否有更多“有思想”的方式来有效地进行二分法?感谢。
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
答案 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 )