Comment est-il possible de transformer le vecteur suivant:

x <- c(0, 0, 0, 1, 0, 3, 2, 0, 0, 0, 5, 0, 0, 0, 8)

Sous la forme souhaitée:

y <- c(1, 1, 1, 1, 3, 3, 2, 5, 5, 5, 5, 8, 8, 8, 8)

Toute idée serait très appréciée.

6
And_R 27 nov. 2017 à 17:55

3 réponses

Meilleure réponse

Voici une autre approche utilisant uniquement la base R:

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

Le vecteur x est maintenant:

x
#[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8
3
talat 27 nov. 2017 à 15:45

En utilisant rle, vous pouvez effectuer les opérations suivantes dans la base 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

Notez que cela suppose que la valeur finale n'est pas 0. Si ce n'est pas le cas, vous pouvez utiliser head(which(tmp$values == 0), -1) à la place de which(tmp$values == 0) pour supprimer la valeur finale.

2
lmo 27 nov. 2017 à 15:17

Vous pouvez utiliser zoo pour remplir les NA via la fonction na.locf comme suit,

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
3
Sotos 27 nov. 2017 à 14:59
47513838