2016-05-25 16 views
12

ein boolean Vektor gegeben, wie kann ich das längste zusammenhängende Stück TRUE und ändern Sie die übrigen TRUE Werte zu FALSE finden?in einem boolean Vektor

Zum Beispiel gegeben ein boolean Vektor:

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

Wie kann ich einen Vektor wie:

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

Meinst du die längste kontinuierliche Kette von TRUE? –

+0

@MhairiMcNeill Ja – sl1129

+6

Das klingt wie '??" run length encoding "' (Wink Wink Hinweis Hinweis) –

Antwort

11

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 TRUEund Ü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 
14

Mit rle:

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

OP didn‘ Antworten auf mögliche Probleme mit diesem Ansatz geben, b ut die komplette Antwort wird vorgeschlagen von docendodiscimus sollte alle möglichen Probleme abdecken.

+4

Warten Sie eine Minute obwohl. Wenn wir mehr FALSE als TRUE hätten, würde das nicht funktionieren, oder? –

+2

@MhairiMcNeill, 'mit (rle (bool), rep (Längen == Max (Längen [Werte]) & Werte, Längen)) könnte robuster sein, obwohl es _alle_ größten Stücke von WAHREN markieren würde (wenn es mehrere Maxima gibt). –

+0

Wenn Sie keine Upvotes möchten, warum nicht löschen? – jpmc26

1

Inspiriert von @ zx8754

Dies sollte auch funktionieren, wenn die längste Gesamtsequenz von FALSE gemacht wird.

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 ja. Und ich habe ein zweites Problem entdeckt, wenn Sie mehrere maximale Sequenzen haben. Ich denke, es sollte jetzt richtig sein, die erste maximale Sequenz zu finden ... –

Verwandte Themen