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.
3 réponses
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
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.
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
De nouvelles questions
r
R est un langage de programmation et un environnement logiciel libres et open source pour le calcul statistique, la bioinformatique, la visualisation et le calcul général. Veuillez fournir des exemples minimaux et reproductibles ainsi que le résultat souhaité. Utilisez dput () pour les données et spécifiez tous les packages non basiques avec des appels à library (). N'incorporez pas d'images pour les données ou le code, utilisez plutôt des blocs de code en retrait. Pour les questions relatives aux statistiques, utilisez https://stats.stackexchange.com.