2012-06-28 74 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