Précédent   Forum du club des développeurs et IT Pro > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/11/2012, 16h06   #1
lmoulin
Invité de passage
 
Inscription : août 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 14
Points : 4
Points : 4
Par défaut Supprimer des doublons (qui ne le sont que partiellement)

Bonjour,

Je me permets de déplacer une discussion que j’avais ouverte initialement dans SAS macro. Je pense que j'aurais plus de chances de trouver une réponse ici

Je cherche a lancer une procédure permettant de supprimer l'intégralité d'une ligne si le nom de la ligne i = le nom de la ligne i+1 (la table ayant déja été classée la ligne i est "plus forte" que la ligne i+1).

Voici la table que j'ai :

nom information 1 information 2 information 3 information 4

Dupont x1 23 36 lo
Dupont x1 71 35 lo
Durand w2 21 78 ml
Dumou j3 23 21 xy
Dumou j1 23 21 xy

Et voici la table que j'aimerais obtenir :

nom information 1 information 2 information 3 information 4

Dupont x1 23 36 lo
Durand w2 21 78 ml
Dumou j3 23 21 xy

Je souhaite supprimer les doublons sur la base de leur ordre d'apparition dans la table, car ils ont été triés en amont sur la base de certaines variables. Il faudrait que je lance une procédure qui, dans le cas ou le nom de la ligne i = le nom de la ligne i+1 (comme dans l'exemple les informations pouvant être différentes entre ces deux personnes qui sont en fait une seule et unique personne), alors SAS "jette" la ligne i+1 (même si les informations diffèrent entre ces deux lignes) pour ne garder une table contenant que les lignes i (dans le cas nom i = nom i+1).

Je ne sais pas si je suis totalement clair, n'hésitez pas à me demander des précisions et merci d'avance pour les solutions que vous me proposerez
lmoulin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 16h09   #2
edward carnby
Membre éprouvé
 
Homme Ludovic Le Breton
Statisticien/développeur BI
Inscription : janvier 2012
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Ludovic Le Breton
Âge : 38
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Statisticien/développeur BI
Secteur : Transports

Informations forums :
Inscription : janvier 2012
Messages : 177
Points : 464
Points : 464
Bonjour,

Normalement, tu pourrais utiliser une proc sort avec l'option NODUPKEY, mais cette procédure ne va conserver que le dernier enregistrement.

Si tu ne veux pas re-trier ta table, tu peux utiliser la fonction lag :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
/* Données source */
DATA test;
input nom $ info1 $ info2 info3 info4 $;
cards;
Dupont x1 23 36 lo
Dupont x1 71 35 lo
Durand w2 21 78 ml
Dumou j3 23 21 xy
Dumou j1 23 21 xy
;
run;
 
DATA test2;
SET test;
IF nom = lag(nom) then DELETE;
run;
edward carnby est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/11/2012, 16h18   #3
xav2229
Membre chevronné
 
Inscription : avril 2009
Messages : 611
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 611
Points : 648
Points : 648
Salut,

Regarde du coté de l'option noduplicate de la PROC SORT.
C'est une option différente de nodupkey.

X
xav2229 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 16h26   #4
lmoulin
Invité de passage
 
Inscription : août 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 14
Points : 4
Points : 4
@ Edward : Merci pour ta solution, je ne comprends pas la table que tu definies en test. J'ai juste utilisé la fonction lag et cela semble marcher, il ne garde que la première information et supprime la ligne en entier.

@ Xav : merci pour ta solution que je n'ai pas testée puisque la précédente marche. En revanche il me semble que l'option noduplicate ne marche que si toutes les valeurs d'une ligne sont identiques, ce qui n'est pas le cas dans mon exemple.


Bonne soirée
lmoulin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h14.


 
 
 
 
Partenaires

Hébergement Web