2012-06-28 36 views
1

我想用纯矩阵操作而不是循环来转换这段逻辑。逻辑是,在我的二进制值向量中,我想要注意每个转换点(即0转为1,其中1转为0)。否则,我想保留原始值。虽然一个简单的循环对于小向量来说足够快,但我需要在大数据集上执行多次这个操作,因此需要通过matrics提高效率。R - 通过向量操作的逻辑操作

x <- c(1,0,0,0,0,1,1,0,0,1,0,1,0,1,0,0,0,1); 
y <- rep(-2, length(x)); 
y[1] <- x[1]; 
for(i in 2:length(x)){ 
    if((x[i]==1 && x[i-1]==0) || (x[i]==0 && x[i-1]==1)){ 
     y[i] = -1; 
    } 
    else{ 
     y[i] = x[i]; 
    } 
} 

Y的最终值是 1 -1 0 0 0 -1 1 -1 0 -1 -1 -1 -1 -1 -1 0 0 -1

我是一个新转换为R,许多在此先感谢

回答

3

您可以使用rle此:

x.rle <- rle(x)$lengths 

x[cumsum(x.rle[1:(length(x.rle) - 1)]) + 1] <- -1 


> x 
[1] 1 -1 0 0 0 -1 1 -1 0 -1 -1 -1 -1 -1 -1 0 0 -1 
+0

谢谢你这个作品!我甚至不知道rle是否存在:) – user1480926

1

这里是另一个可能的解决方案:

x2 <- c(x[1], x[1:(length(x) - 1)]) 

x_out <- x 
x_out[x != x2] <- -1 
x_out 
[1] 1 -1 0 0 0 -1 1 -1 0 -1 -1 -1 -1 -1 -1 0 0 -1 
+0

谢谢bdemarest。这也相当优雅,并不需要了解运行长度编码等。 – user1480926

+0

耻辱我不能接受这两种解决方案:) – user1480926

+0

不客气。我希望这对你或其他人有帮助! – bdemarest