fonction rle()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Delalande Lucas
Messages : 40
Enregistré le : 14 Déc 2017, 08:48

fonction rle()

Messagepar Delalande Lucas » 12 Mar 2018, 12:49

Bonjour,

J'ai un vecteur :
a<-c(0,0,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0)
J'utilise la fonction rle()
b<-rle(a)
ce qui donne b : $lengths : 2 4 2 2 1 5 1
$values : 0 1 0 1 0 1 0

Je souhaite avoir un vecteur qui m'identifie les positions dans "a" des séries de 4 1 (4x1 d'affilé)
soit :
c<-c(3,4,5,6,12,13,14,15,16)

Une idée ?

Merci!

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: fonction rle()

Messagepar Logez Maxime » 12 Mar 2018, 13:28

Bonjour,

une possibilité avec le package stringi :

Code : Tout sélectionner

b <- paste(a, collapse = "")
res <- stri_locate_all_regex(b, pattern = "1{4,}")
res
[[1]]
     start end
[1,]     3   6
[2,]    12  16
unlist(mapply(seq, res[[1]][,1], res[[1]][,2]))
[1]  3  4  5  6 12 13 14 15 16
Après ce code fonctionne mais ne détecte pas réellement les séries de 4 valeurs consécutives parce que si tu reste sur 4 '1' stricts "1{4}", la série de 13 à 16 n'est pas détectée.

Cordialement,
Maxime

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: fonction rle()

Messagepar Pierre-Yves Berrard » 12 Mar 2018, 13:33

Une autre possibilité :

Code : Tout sélectionner

fins <- cumsum(b$lengths)
debuts <- fins - b$lengths + 1
indices <- mapply(seq, debuts, fins)

indices_4x1 <- indices[b$values == 1 & b$lengths >= 4]
(res <- unlist(indices_4x1))
PY

Delalande Lucas
Messages : 40
Enregistré le : 14 Déc 2017, 08:48

Re: fonction rle()

Messagepar Delalande Lucas » 12 Mar 2018, 14:17

Super, merci beaucoup !

Et si je veux obtenir la série plus la position de l’élément d’après.. c'est a dire :
res<- 3 4 5 6 7 12 13 14 15 16 17

(élément 7 et 17 en plus)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: fonction rle()

Messagepar Logez Maxime » 12 Mar 2018, 15:00

re,

Code : Tout sélectionner

unlist(mapply(seq, res[[1]][,1], res[[1]][,2] +1))
Cordialement,
Maxime

Delalande Lucas
Messages : 40
Enregistré le : 14 Déc 2017, 08:48

Re: fonction rle()

Messagepar Delalande Lucas » 12 Mar 2018, 15:04

tout simplement , merci beaucoup !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité