基于向量运算的R逻辑操作
我想用纯矩阵运算而不是for循环来转换这段逻辑。逻辑是,在我的二进制值向量中,我想记录每个转换点(即,0变为1,1变为0)。否则,我希望保留原始值。虽然一个简单的循环对于小向量来说足够快,但我需要在大型数据集上多次执行此操作,因此需要通过矩阵来提高效率基于向量运算的R逻辑操作,r,for-loop,logic,binary-data,vectorization,R,For Loop,Logic,Binary Data,Vectorization,我想用纯矩阵运算而不是for循环来转换这段逻辑。逻辑是,在我的二进制值向量中,我想记录每个转换点(即,0变为1,1变为0)。否则,我希望保留原始值。虽然一个简单的循环对于小向量来说足够快,但我需要在大型数据集上多次执行此操作,因此需要通过矩阵来提高效率 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 <- 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];
}
}
x您可以为此使用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
x.rle您可以为此使用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
x.rle这里是另一种可能的解决方案:
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
x2以下是另一种可能的解决方案:
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
x2非常感谢您。这也是非常优雅的,不需要了解运行长度编码等。欢迎您。我希望它对你或其他人有帮助!非常感谢你。这也是非常优雅的,不需要了解运行长度编码等。欢迎您。我希望它对你或其他人有帮助!