【问题标题】:R - logic manipulation via vector operationsR - 通过向量运算进行逻辑操作
【发布时间】:2012-06-30 09:33:12
【问题描述】:

我想用纯矩阵运算而不是 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];
     }
}

y 的最终值为 1 -1 0 0 0 -1 1 -1 0 -1 -1 -1 -1 -1 -1 0 0 -1

我是 R 的新转换者,在此先感谢

【问题讨论】:

    标签: r for-loop logic binary-data vectorization


    【解决方案1】:

    您可以为此使用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
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 谢谢bdemarest。这也很优雅,不需要了解运行长度编码等。
      • 不客气。希望对您或其他人有所帮助!
      猜你喜欢
      • 2021-06-20
      • 2017-04-29
      • 2015-12-28
      • 2016-10-04
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多