2014-12-03 39 views
1

我有R中的下列載體圖案:R:連續的1的數(從左至右)

零和一(二進制矢量,每個具有長度爲4),例如甲矢量:

x <- c(1,0,1,1) 

我想找到的數量的連續1(S)(由左到右,這是非常重要的)

編輯:
如何做到這一點的矩陣,在每個矢量具有該模式 上文提到的。
最好使用基本功能(並且沒有任何類似Rcpp的解決方案)

任何漂亮的解決方案,沒有*應用函數?

+0

你爲什麼在大括號了對0,1?你真的有4x2矩陣或什麼?在你的問題中構建矩陣。 – Spacedman 2014-12-05 17:01:43

+0

@Spacedman,你會用它來解釋每個矢量值是0/1嗎? – YevgenyM 2014-12-05 17:03:37

+0

我會說「一個零和一個向量,例如'x = c(0,0,1,1,1,1,0,0)'我們都在這裏說R,你的問題沒有R代碼它或示例數據,所以它很難知道你想要什麼 – Spacedman 2014-12-05 17:33:52

回答

0

這裏是我的解決方案:

max(cumprod(temp1) * cumsum(temp1)) 

例子:

temp1 <- c(1,0,1,0) 
max(cumprod(temp1) * cumsum(temp1)) 
#[1] 1 

temp1 <- c(1,1,1,0) 
max(cumprod(temp1) * cumsum(temp1)) 
#[1] 3 

temp1 <- c(0,1,1,0) 
max(cumprod(temp1) * cumsum(temp1)) 
#[1] 0 
+0

如果anoyone有更快/更優雅的解決方案,我想知道它: ) – YevgenyM 2014-12-03 15:35:39

+2

'帶有(rle(temp_vector),長度*值)[1]'。插入圖片而不是代碼非常有用,請編輯答案並添加代碼 – rawr 2014-12-03 15:45:02

1

爲此,您可以更快地使用RCPP:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int contiones(LogicalVector x) { 
    int count = 0; 
    for (int i = 0; i < x.size(); i++) 
    { 
    if (x(i)) { 
     count++; 
    } 
    else { 
     break; 
    } 
    } 
    return count; 
} 

請注意,我將輸入(隱含的)成一個邏輯向量。如果您的輸入只包含0/1值,這些值不重要,但它會將所有其他數字與1相同。根據需要添加輸入檢查。

測試在R:

a <- c(1,1,1,0,1) 
contiones(a) 
#[1] 3 
b <- c(0,1,1,1,0,1) 
contiones(b) 
#[1] 0 
c <- c(1:5,0) 
contiones(c) 
#[1] 5