2016-05-25 15 views
12

Boolean vektörü verildiğinde, TRUE'un en uzun sürekli yığınını nasıl bulabilir ve kalan TRUE değerlerini FALSE olarak değiştirebilirim?Bir boolean vektöründe en uzun sürekli kesriyi bul

c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE) 
+0

TRUE'nin en uzun sürekli zinciri mi demek istiyorsun? –

+0

@MhairiMcNeill Evet – sl1129

+6

Bu, "?? uzunluk kodlaması" işlevini ("wink wink ipucu ipucu)" –

cevap

11

İşte bir boolean vektör ardışık TRUE s her uzun parçalarını vurgular bir yaklaşımdır. Yani, aynı (maks) uzunluğa sahip iki TRUE parça varsa, her ikisi de çıkışta TRUE olarak bildirilecektir.

Biz kullanabilir:

with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths)) 

anlamına gelmektedir:

  • with(rle(bool), ...): çalıştırma
  • lengths == max(lengths[values]) & values uzunlukları hesaplamak: Her çalışma uzunluk değerleri maksimum akış uzunluğuna eşit olup olmadığını kontrol TRUEve ayrıca değerlerin kendisinin olup olmadığını da kontrol edin TRUE
  • rep(...., lengths): sıklıkta kendi çalışma uzunluğu var olarak ortaya çıkan Mantıksal bölümler her tekrarlamak

OP'ın test durumu:

bool <- c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE) 
with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths)) 
# [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE 

İkinci test durumu: T ve F aynı maxima:

x <- c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE) 
with(rle(x), rep(lengths == max(lengths[values]) & values, lengths)) 
# [1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Üçüncü sınama durumu: F, T:

'dan daha fazla parça daha uzun
y <- c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE) 
with(rle(y), rep(lengths == max(lengths[values]) & values, lengths)) 
# [1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
14

kullanma .rle:

bool = c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE) 

Nasıl bir vektör gibi alabilirsiniz:

myRle <- rle(bool)$length 
rep(myRle == max(myRle), myRle) 

OP yapmadım' boole vektör Verilen örnek için

, Bu yaklaşımla olası sorunlara cevap vermek, b ut tam cevap docendodiscimus tarafından önerilen tüm olası sorunları kapsamalıdır. zx8754

Bu uzun genel sekans FALSE yapılmış olsa bile çalışması gerekir @ ilhamla

+4

Bir dakika bekleyin. Eğer DOĞRULAR'dan daha uzun bir FALSE çalıştırmış olsaydık, bu işe yaramazdı, değil mi? –

+2

@MhairiMcNeill, 'ile birlikte (rle (bool), rep (uzunluk == maks (uzunluk [değerler]) ve değerler, uzunluklar))' daha büyük olabilirlerse, _all_ TRUE'lerin en büyük parçalarını işaretler (eğer birden fazla maxima varsa)). –

+0

Yükseltmeler istemiyorsanız, neden silinmez? – jpmc26

1

.

runs <- rle(bool) 
lengths <- runs$lengths 

is_max <- which(lengths == max(lengths[runs$values]) & runs$values) 
rep(1:length(lengths) == is_max[1], lengths) 
+0

Ah evet. Birden fazla maksimum diziniz olduğunda ikinci bir problem tespit ettim. İlk maksimum diziyi bulmak için şu an olması gerektiğini düşünüyorum. –