2017-11-27 412 views

Odpowiedz

3

Oto kolejny podejście używając tylko zasady R:

idx <- x != 0 
split(x, cumsum(idx) - idx) <- x[idx] 

Wartości x-wektor jest teraz:

x 
#[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8 
+0

fantastyczne rozwiązanie! –

3

można użyć zoo wypełnić NAS poprzez na.locf funkcji w następujący sposób

zoo::na.locf(replace(x, x==0, NA), fromLast = TRUE) 
#[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8 
2

Korzystanie rle można wykonać następujące czynności w bazowej R.

tmp <- rle(x) 
tmp$values[which(tmp$values == 0)] <- tmp$values[which(tmp$values == 0) + 1L] 

inverse.rle(tmp) 
[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8 

pamiętać, że ta przyjmuje wartość końcową nie jest 0. Jeśli tak nie jest, możesz użyć head(which(tmp$values == 0), -1) zamiast which(tmp$values == 0), aby usunąć ostatnią wartość.