2017-03-21 4 views
4

Was ist eine clevere (d. H. Nicht eine Schleife) Möglichkeit, die Länge jedes Zaubers von fehlenden Werten in einem Vektor zu erhalten? Meine ideale Ausgabe ist ein Vektor, der die gleiche Länge hat, in der jeder fehlende Wert durch die Länge des Zaubers der fehlenden Werte ersetzt wird, von denen er ein Teil war, und alle anderen Werte 0 sind.Get Länge von Läufen von fehlenden Werten in Vektor

Also, für die Eingabe wie:

x <- c(2,6,1,2,NA,NA,NA,3,4,NA,NA) 

Ich möchte eine Ausgabe wie:

y <- c(0,0,0,0,3,3,3,0,0,2,2) 

Antwort

9

Eine einfache Option rle:

m <- rle(is.na(x)) 
> rep(ifelse(m$values,m$lengths,0),times = m$lengths) 
[1] 0 0 0 0 3 3 3 0 0 2 2 
+2

'rep (RLE (is.na (x)) Wert $ * rle (is.na (x)) $ Länge, rle (is.na (x)) $ Länge) '. Das funktioniert auch. – JasonWang

1

ich unabhängig auf etwas arbeitete unter Verwendung von rle() und entweder cumsum() oder dplyr group_by() und n() Gruppe Längen von NAs zu erhalten:

> x2 <- as.numeric(is.na(x)) 
    0 0 0 0 1 1 1 0 0 1 1 

> rle(x2) 
Run Length Encoding 
    lengths: int [1:4] 4 3 2 2 
    values : num [1:4] 0 1 0 1 

# Now we can assign group-numbers... 
> cumsum(c(diff(x2)==+1,0)) * x2 
    0 0 0 0 1 1 1 0 0 2 2 
# ...then get group-lengths from counting those... 
> rle(cumsum(c(diff(x2)==+1,0)) * x2) 
Run Length Encoding 
    lengths: int [1:4] 4 3 2 2 
    values : num [1:4] 0 1 0 2 

Wir etwas Flickschusterei könnte, aber es wird nicht so kompakt und elegant wie @ Jorans Lösung sein.

1

Hier ist eine weitere Option mit rleid und ave

library(data.table) 
ave(x, rleid(is.na(x)), FUN = length)*is.na(x) 
#[1] 0 0 0 0 3 3 3 0 0 2 2 
Verwandte Themen