Subset en boucle (conditions sur lignes consécutives)

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

Pablo Campargue Rodriguez
Messages : 3
Enregistré le : 18 Fév 2019, 21:29

Subset en boucle (conditions sur lignes consécutives)

Messagepar Pablo Campargue Rodriguez » 20 Mar 2019, 15:03

Bonjour,

Je bloque depuis un certain temps sur un problème. Je souhaiterais isoler les lignes d'un dataframe (FatMatrice) pour lesquelles une colonne (appelée BC) connaitrait des valeurs supérieures à une valeur (disons 2), et ce sur 6 lignes à la suite.
Par exemple, la série de valeurs de la colonne BC ayant les valeurs 1.8; 2.1; 2.5; 2.6; 2.5; 2.2; 1.3 ne seraient pas extraites.

Ce dont je suis capable de faire ne permet pas de prendre en compte la condition des 6 valeurs consécutives :
FatMatrice.sup <- subset(FatMatrice, BC>2)

Merci pour votre aide !

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

Re: Subset en boucle (conditions sur lignes consécutives)

Messagepar Pierre-Yves Berrard » 20 Mar 2019, 15:53

Bonjour,

La fonction "rle" est pratique pour calculer des séries et leur nombre d'occurences.

Une proposition en prenant une longueur de 3 au lieu de 6 (pour simplifier) :

Code : Tout sélectionner

donnees <- data.frame(ID = 1:8, BC = c(3, -100, 5, 4, 6, -100, 9, 5))

seuil <- 2
occurences <- 3 # (6 dans votre cas)

series <- rle(donnees$BC > seuil)

fin_grp <- cumsum(series$lengths)
debut_grp <- fin_grp - series$lengths + 1
lignes_grp <- Map(seq, debut_grp, fin_grp)

garde <- lignes_grp[series$values & series$length == occurences]
res <- donnees[unlist(garde), ]

edit : réminiscence
PY

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

Re: Subset en boucle (conditions sur lignes consécutives)

Messagepar Logez Maxime » 20 Mar 2019, 21:13

Bonjour,

en reprenant l'idée de Pierre-Yves j'aurai fait :

Code : Tout sélectionner

rle1 <- rle(donnees$BC >= seuil)
rle1$values <- with(rle1, values & (lengths >= occurences))
donnees[inverse.rle(rle1),]
Cordialement,
Maxime

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

Re: Subset en boucle (conditions sur lignes consécutives)

Messagepar Pierre-Yves Berrard » 21 Mar 2019, 10:33

Astucieux !
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Bertrand Vassor et 1 invité