Hier ist ein Ansatz, der alle längsten Stücke von aufeinanderfolgenden TRUE
s in einem boolean Vektor wird markieren. Das heißt, wenn es beispielsweise zwei TRUE
Chunks der gleichen (maximalen) Länge gibt, werden beide in der Ausgabe als TRUE
gemeldet.
können wir verwenden:
with(rle(bool), rep(lengths == max(lengths[values]) & values, lengths))
was bedeutet:
with(rle(bool), ...)
: Berechne der Lauf
lengths == max(lengths[values]) & values
Längen: prüfen, ob jede Lauflänge zu der maximalen Lauflänge gleich ist, wo Werte TRUE
und Überprüfen Sie auch, ob die Werte selbst TRUE
sind
rep(...., lengths)
: jeder der resultierenden Logicals beliebig oft wiederholen, wie es eigene Lauflänge ist
des OP Testfall:
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
Zweiter Testfall: gleiche Maxima für T und 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
Dritter Testfall: F längerer Block als 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
Meinst du die längste kontinuierliche Kette von TRUE? –
@MhairiMcNeill Ja – sl1129
Das klingt wie '??" run length encoding "' (Wink Wink Hinweis Hinweis) –