Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于向量运算的R逻辑操作_R_For Loop_Logic_Binary Data_Vectorization - Fatal编程技术网

基于向量运算的R逻辑操作

基于向量运算的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

我想用纯矩阵运算而不是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[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非常感谢您。这也是非常优雅的,不需要了解运行长度编码等。欢迎您。我希望它对你或其他人有帮助!非常感谢你。这也是非常优雅的,不需要了解运行长度编码等。欢迎您。我希望它对你或其他人有帮助!