supprimer les chiffres consecutifs qui se repetent

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

supprimer les chiffres consecutifs qui se repetent

Messagepar Delalande Lucas » 14 Sep 2018, 10:20

Bonjour

J'a un DF avec une colonne ayant des valeurs qui se répètent :

df$vec<-c(1,1,1,600,3,4,9,3,3,3,3,1,3,650...)

Je voudrais supprimer les doublons (n'en garder que un enfaite) mais uniquement les consécutif, c'est a dire obtenir :

df$vec<-c(1,600,3,4,9,3,1,3,650...)

Une idée ?
Merci!

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

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Pierre-Yves Berrard » 14 Sep 2018, 10:24

Bonjour

Une fonction que j'avais créée pour répondre à la même problématique :

Code : Tout sélectionner

rm_following_double <- function(x) {
  if (anyNA(x)) stop("impossible : valeur(s) manquante(s)")
  garde <- x[-1] != x[-length(x)]
  x[c(garde, TRUE)]
}
PY

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Eric Casellas » 14 Sep 2018, 11:39

Bonjour,

A priori la fonction rle fait ce que tu veux :

Code : Tout sélectionner

rle(c(1,1,1,600,3,4,9,3,3,3,3,1,3,650))$values


Eric
Eric

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

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Delalande Lucas » 14 Sep 2018, 12:06

Super merci beaucoup!

Après pour supprimer de mon tableau ces valeurs en double ? (ca doit être simple mais je n'arrive pas à le retrouver!)

C'est à dire avec mon tableau de départ à 3 colonne : a,b et vec :

a b vec
4 7 1
5 3 1
8 2 4

obtenir:

a b vec
4 7 1
8 2 4

Merci !

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Eric Casellas » 14 Sep 2018, 13:14

Une proposition rapide (mais il y a surement mieux à faire en terme de temps d'execution que ma boucle for)

Code : Tout sélectionner

X <- data.frame(A=LETTERS[1:14], B=c(1,1,1,600,3,4,9,3,3,3,3,1,3,650))
myrle <- rle(X$B)$lengths
indexes <- c(1)
for (repnum in myrle[-length(myrle)]) {
  indexes <- c(indexes, indexes[length(indexes)]+repnum)
}

X[indexes, ]


Eric
Eric

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

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Delalande Lucas » 14 Sep 2018, 13:30

Pas si simple enfaite!

mais ca marche nickel merci beaucoup !

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Serge Rapenne » 14 Sep 2018, 14:00

Bonjour,

une solution avec le package dplyr :

Code : Tout sélectionner

library(dplyr)
X <- data.frame(A=LETTERS[1:14], B=c(1,1,1,600,3,4,9,3,3,3,3,1,3,650))

first_occur<-function(x) x!=lead(x, default="")
ligne<-first_occur(X[ ,2])
X[ligne,]
  A   B
3  C   1
4  D 600
5  E   3
6  F   4
7  G   9
11 K   3
12 L   1
13 M   3
14 N 650


Serge

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Eric Casellas » 14 Sep 2018, 14:20

Serge Rapenne a écrit :Bonjour,

une solution avec le package dplyr :

Code : Tout sélectionner

library(dplyr)
X <- data.frame(A=LETTERS[1:14], B=c(1,1,1,600,3,4,9,3,3,3,3,1,3,650))

first_occur<-function(x) x!=lead(x, default="")
ligne<-first_occur(X[ ,2])
X[ligne,]
  A   B
3  C   1
4  D 600
5  E   3
6  F   4
7  G   9
11 K   3
12 L   1
13 M   3
14 N 650


Serge


Serge,

De ce que j'en vois, avec ton exemple on a le dernier élément répété au lieu du premier (par exemple pour la 1ere colonne de la 1ere ligne tu as un C au lieu de A)

Eric
Eric

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Serge Rapenne » 14 Sep 2018, 14:43

Toutafé,

il faut effectivement remplacer lead par lag dans la fonction :

Code : Tout sélectionner

first_occur<-function(x) x!=lag(x, default="")
ligne<-first_occur(X[ ,2])
> X[ligne,]
   A   B
1  A   1
4  D 600
5  E   3
6  F   4
7  G   9
8  H   3
12 L   1
13 M   3
14 N 650


merci pour la remarque Eric

Bon WE

Serge

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar François Bonnot » 17 Sep 2018, 08:01

Bonjour,
Autre solution :

Code : Tout sélectionner

X[c(1,diff(X$B))!=0,]
François

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: supprimer les chiffres consecutifs qui se repetent

Messagepar Serge Rapenne » 17 Sep 2018, 09:09

Simple, efficace, j'aime bcp

Serge


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité