2016-05-25 12 views
12

Biorąc pod uwagę wektor boolowski, jak znaleźć najdłuższy ciągły fragment TRUE i zmienić pozostałe wartości TRUE na FALSE?Znajdź najdłuższy ciągły fragment TRUE w wektorze boolowskim.

Na przykład, biorąc pod uwagę wartość logiczną wektor:

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

Jak mogę uzyskać wektor jak:

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

Czy masz na myśli najdłuższy ciągły łańcuch PRAWDY? –

+0

@MhairiMcNeill Tak – sl1129

+6

To brzmi jak "?" Kodowanie długości biegu "(mrugnięcie podpowiedź do podpowiedzi) –

Odpowiedz

11

Oto podejście, które podkreśli wszystkie najdłuższe kawałki kolejnych TRUE s w logiczną wektorze. Oznacza to, że jeśli istnieją, powiedzmy, dwie porcje o tej samej (maksymalnej) długości, oba będą zgłaszane jako dane wyjściowe jako TRUE.

Możemy użyć:

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

co oznacza:

  • with(rle(bool), ...): obliczyć run długości
  • lengths == max(lengths[values]) & values: sprawdzić, czy każdy odcinek prowadzony jest równa maksymalnej długości przebiegu gdzie wartości jest TRUEi sprawdź również, czy same wartości to TRUE
  • rep(...., lengths): powtarzanie wszystkich wynikających logicals tak często, jak jest to własny długość run

Test case OP:

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 

Drugi przypadek testowy: same maksima dla T i F:

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 

Trzecie badanie: F dłużej niż T:

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

Korzystanie RLE:

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

OP didn” • dostarczyć odpowiedzi na możliwe problemy z tym podejściem, b pełna odpowiedź jest proponowana przez docendodiscimus powinna obejmować wszystkie możliwe problemy.

+4

Zaczekaj chwilę. Gdybyśmy mieli dłuższy bieg FAŁSZ niż PRAWDZIWY, to by nie działało, prawda? –

+2

@MhairiMcNeill, 'with (rle (bool), rep (długości == max (długości [wartości]) i wartości, długości))' może być bardziej niezawodny, chociażby oznaczyć _all_ największe kawałki PRAWDA (jeśli istnieje wiele maksimów). –

+0

Jeśli nie chcesz zachować wersji przestawnej, dlaczego nie chcesz usunąć? – jpmc26

1

Z inspiracji @ zx8754

To powinno działać nawet podczas najdłuższych całkowita sekwencja jest wykonana z FALSE.

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 tak. I zauważyłem drugi problem, gdy masz wiele sekwencji maksymalnych. Myślę, że powinno być teraz, aby znaleźć pierwszą maksymalną sekwencję ... –