1

このロジックを、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-10 0 0 -1 1 -1 0 -1 -1 -1 -1 -1 -1 0 0 -1

私はRへの新しい改宗者です、事前に感謝します

4

2 に答える 2

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
于 2012-06-28T20:04:06.363 に答える
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
于 2012-06-28T20:33:02.107 に答える