Si j'ai un vecteur comme
"b": 2 2 3 3 3 4 4 4 4 2 2 3 3 3
Comment puis-je générer un vecteur de même longueur contenant le nombre d'éléments consécutifs, comme ceci:
"a": 0 0 1 1 1 0 0 0 0 1 1 0 0 0
3 Réponses :
Créez une variable de regroupement en utilisant diff
et utilisez-la dans ave
pour calculer la longueur
de chaque groupe.
x <- c(0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0)
Vous pouvez faire de même avec dplyr
lag
library(data.table) ave(x, rleid(x), FUN = length) #[1] 2 2 3 3 3 4 4 4 4 2 2 3 3 3
Et pour être complet avec data.table
rleid
library(dplyr) ave(x,cumsum(x != lag(x, default = FALSE)), FUN = length) #[1] 2 2 3 3 3 4 4 4 4 2 2 3 3 3
ave(x, cumsum(c(0, diff(x) != 0)), FUN = length) # [1] 2 2 3 3 3 4 4 4 4 2 2 3 3 3
Une autre option utilisant rle
et rep
a <- c(0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0)
with(rle(a), rep(lengths, times = lengths)) # [1] 2 2 3 3 3 4 4 4 4 2 2 3 3 3
Voici une autre solution utilisant vapply
count_consec <- function (a) { # creating output vector out out <- integer(length(a)) # consecutive differences diffs <- which(diff(a) != 0) # returning 0 just in order to have a return statement in vapply - you can return anything else vapply(1:(length(diffs)+1), function (k) { if (k == 1) { out[1:diffs[1]] <<- diffs[1] return (0L) } if (k == length(diffs)+1) { out[(diffs[k-1]+1):length(out)] <<- length(out) - diffs[k-1] return (0L) } out[(diffs[k-1]+1):diffs[k]] <<- diffs[k] - diffs[k-1] return (0L) }, integer(1)) out } count_consec(a) # [1] 2 2 3 3 3 4 4 4 4 2 2 3 3 3
avec les données a