Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 17h28   #1
Invité de passage
 
Charles Mercier
Inscription : janvier 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : Charles Mercier

Informations forums :
Inscription : janvier 2010
Messages : 18
Points : 3
Points : 3
Par défaut Sauvegarder les doublons et les originaux

Bonjour,

Malgré de nombreux sujets sur les doublons dans le forum, je n'ai pas trouvé de réponse à ma question précise. En fait, j'ai des observations et j'aimerais créer une table où il y a tous les doublons selon certaines variables, c'est-à-dire même les "originaux".

Je connais l'option nodupkey de la proc sort ; malheureusement, cela me permet uniquement d'avoir les doublons, mais pas les originaux.

Quelqu'un pourrait-il m'aider ?

Merci !
carl-9000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h41   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour Carl,
La table avant suppression contient les originaux ainsi que les doublons. Je ne comprends pas ta question.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h43   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour Charles.
Tu peux recourir à une étape DATA en ayant trié au préalable. Le tri fait par SAS génère des marqueurs de blocs d'observations qui sont accessibles dans l'étape DATA : FIRST si c'est la 1e observation d'un bloc de valeurs semblables, et LAST si c'est la dernière observation du bloc.
Un doublon, c'est une ligne qui n'est pas à la fois la 1e et la dernière observation d'un bloc.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA work.test ;
  INPUT x y ;
DATALINES ;
1 1
1 2
1 3
2 1
3 1
3 2
;
RUN ;
PROC SORT DATA=work.test ;
  BY x ;
RUN ;
DATA work.multiples ;
  SET work.test ;
  BY x ;
  IF NOT(FIRST.x AND LAST.x) THEN OUTPUT ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h52   #4
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Si je comprends, tu veux sortir toutes les observations dont la valeur d'une variable clef est présente au moins deux fois dans le jeu de données. c'est très simple en sql car on peut directement compter le nombre de fois qu'est présente une modalité(sans traitement préalable):

Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE DOUBLONS(WHERE=(CNT>1) AS
SELECT *, count (VARCLEF) AS CNT
FROM ORIGINE
GROUP BY VARCLEF
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h18   #5
Invité de passage
 
Charles Mercier
Inscription : janvier 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : Charles Mercier

Informations forums :
Inscription : janvier 2010
Messages : 18
Points : 3
Points : 3
Merci pour votre intervention rapide !

Megamind2, je reformule ce que je voudrais : j'ai une table et j'aimerais sélectionner dans cette table les observations qui ont un certain nombre de variables en commun et les mettre dans une autre table pour les visualiser.



Olivier & Manoutz, j'ai essayé vos solutions, mais le problème c'est que je ne sais pas comment faire lorsque je sélectionne selon plusieurs variables... Dans la proq sql, j'ai essayé count (varx, vary), mais ça ne marche pas. Comment dois-je faire ?
carl-9000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h21   #6
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
essaye cela:

Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE DOUBLONS(WHERE=(CNT>1) AS
SELECT *, count (*) AS CNT
FROM ORIGINE
GROUP BY VARCLEF1, VARCLEF2
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h10   #7
Invité de passage
 
Charles Mercier
Inscription : janvier 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : Charles Mercier

Informations forums :
Inscription : janvier 2010
Messages : 18
Points : 3
Points : 3
Voilà ce que me dit le journal, il n'a pas l'air d'être content avec l'étoile (je suis désolé, je ne m'y connais pas du tout en sql) :


1164 proc sql;
1165 CREATE TABLE DOUBLONS(WHERE=(CNT>1) AS
1166 SELECT *, count (*) AS CNT
-
22
76

ERROR 22-322: Erreur de syntaxe ; syntaxe requise : CHAR, CHARACTER, DATE, DEC, DECIMAL, DOUBLE, FLOAT, INT, INTEGER, NUM, NUMERIC,
REAL, SMALLINT, VARCHAR.
carl-9000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h52   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
ça devait marcher Charles,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA ORIGINE;
INPUT VARCLEF1$ VARCLEF2 $ SOLDE;
CARDS;
01 01 96
01 01 98
02 01 69
;
RUN;
 
PROC SQL;
CREATE TABLE DOUBLONS AS
SELECT *, count (*) AS CNT
FROM ORIGINE
GROUP BY VARCLEF1, VARCLEF2 HAVING(CNT)>1
;
QUIT;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 20h04   #9
Invité de passage
 
Charles Mercier
Inscription : janvier 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : Charles Mercier

Informations forums :
Inscription : janvier 2010
Messages : 18
Points : 3
Points : 3
J'ai fait la proc sql, et ça marche nickel ! (par contre j'ai essayé l'étape data avant, ça ne marche pas... et je ne vois pas à quoi ça sert en fait !).

Juste une vérification, il me dit :

NOTE: La requête nécessite que les statistiques descriptives soient refusionnées avec les données originales.

C'est normal ?

En tout cas, ça a l'air de marcher je vous remercie tous, j'ai passé mon après midi dessus !!!
carl-9000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h00   #10
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 73
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 73
Points : 32
Points : 32
l'option dupout de la proc sort permet de récupérer la liste de doublons.

Code :
1
2
3
4
5
PROC SORT DATA = DATA DUPOUT = doublons 
          OUT = data_ss_doublon
           NODUPKEY ; 
  BY ip ;
RUN ;
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h13   #11
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Je savais qu'il y avait une option, mais je me souvenais plus

ps: BIENVENUE sur le forum Momo
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h45   #12
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
L'option dupout de la proc sort ne fait pas exactement la même chose: dans ce fichier sera conservé uniquement les doublons, et pas les valeurs qui sont conservées dans le out= possédant la même clé.

La proc sql procède différemment.

Un bon exemple vaut bien tous les discours:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATA duplicate;
input valkey val ;
cards;
1 1
1 3
1 7
2 3
2 1
3 45
;
run;
 
proc sql;
CREATE TABLE versionsql AS
SELECT *, count(*) AS cnt
FROM duplicate
GROUP BY valkey 
HAVING cnt>1;
quit;
 
proc sort DATA=duplicate out=noduplic dupout=versionsort nodupkey;
BY valkey;
run;
Comparez les fichiers versionsql et versionsort.


Manoutz
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/05/2011, 09h34   #13
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 73
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 73
Points : 32
Points : 32
Merci Megamind

Merci Manoutz.
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web