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 13/09/2011, 22h20   #1
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 17
Points : 10
Points : 10
Par défaut Qualité de données : corriger les erreurs

J'ai une table qui a un problème de qualité de donné et j'aimerai corriger les erreurs:
chaque ID doit correspondre à un auteur ou plusieurs auteurs avec chacun leur adresse. une colonne non renseigné prend la valeur -1. Donc je veux prendre ce qui manque les premiers adresse dessous et les faire remonter en dessus et les faire correspondre aux auteurs dans l'ordre alphabétique.
en entrée j'ai :
ID.............authors_ID ..............adress_id
1............... 4............................-1
1............... 5............................-1
1............... -1...........................A
1............... -1............................B
2............... 1............................-1
2............... 2............................-1
2............... 3............................-1
2...............-1............................D
2............... -1............................E
2................-1.............................F

en sorti je veux avoir:
ID.............authors_ID ..............adress_id
1............... 4...........................A
1............... 5............................B
2................1.............................D
2................2.............................E
2................3.............................F
boudake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h22   #2
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Salut voici une solution:

Il y a probablement moyen de le faire autrement mais ceci fonctionne.

J'avoue aussi avoir été perturbé par ton ID:
Que deux auteurs aient le même ID, je peux le comprendre. (un livre écrit par deux auteurs)
Mais que deux adresses aient le même ID -->?

Comment peux-tu savoir quelle adresse va à quel auteur?

Sinon si ton fichier source suit bien le même schéma que ce que tu nous a montré (le même ordre, le même nombre d'adresses que d'auteurs...),
tu peux essayer comme ceci.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
/* le data quality est la table que tu nous as montré en exemple */
proc sort DATA=quality(DROP= adress_id WHERE=(NOT missing(authors_id))) out=auth;
	BY id authors_id;
run;
 
proc sort DATA=quality(DROP= authors_id WHERE=(NOT missing(adress_id))) out=adress;
	BY id adress_id;
run;
 
/*Ici je rajoute un id uniqie pour cahque ligne --> id2 */
DATA adress_2id;
	SET adress;
	id2 + 1;
run;
 
DATA auth_2id;
	SET auth;
	id2 + 1;
run;
 
/* id2 sert pour la jointure*/
proc sql;
	CREATE TABLE res_sql AS
	SELECT a.id, a.authors_ID, b.adress_ID, 
	FROM auth_2id AS A LEFT JOIN adress_2id AS B
	ON A.id2 = B.id2;
quit;
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h05   #3
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 17
Points : 10
Points : 10
Par défaut reponse

il s'agit des articles écrit par un ou plusieurs auteurs. chaque auteur à son propre adresses.
Donc on a pris un echantillon pour calculer la marge d'erreur. il s'est avérer que, pour chaque article, les N auteurs, dans l'ordre croissant, correspondent aux N adresses dans l'odre croissant
boudake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h09   #4
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Ok, donc ça solutionne ton problème ou pas?
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h19   #5
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : mai 2011
Messages : 17
Points : 10
Points : 10
Par défaut reponse

Non ça règle pas mon problème car le ID du l'article ne doit pas être changé. il reste le même. J'ai besoin juste de faire correspondre mes auteurs dans l’ordre croissant au adresse dans l’ordre croissant.
boudake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h34   #6
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Euh..
L'id de tes articles, je ne le change pas. --> il reste "ID".
En fait je rajoute juste un "id2" pour faire la jointure.

Pour le fait de faire correspondre dans l'ordre croissant, c'est aussi dans mon code (proc sort)

Tu as essayé mon code?

Sinon, je pense pas vraiment comprendre ton problème....
pourtant j'ai fait le test avec les même entrées que tu as données et j'obtiens la sortie que tu as demandé
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 17h47   #7
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Bonsoir

Une autre solution avec la proc transpose si toutes tes variables identifiants sont caractères

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
DATA a;
authors_id='  ';adress_id='  ';
id='1';authors_ID='4';adress_id='-1';output;
id='1';authors_ID='5';adress_id='-1';output;
id='1';authors_ID='-1';adress_id='A';output;
id='1';authors_ID='-1';adress_id='B';output;
id='2';authors_ID='1';adress_id='-1';output;
id='2';authors_ID='2';adress_id='-1';output;
id='2';authors_ID='3';adress_id='-1';output;
id='2';authors_ID='-1';adress_id='D';output;
id='2';authors_ID='-1';adress_id='E';output;
id='2';authors_ID='-1';adress_id='F';output;
run;
 
DATA b; SET a;
length texte $50. texte_type $10.;
IF adress_id='-1' then do;texte=authors_id;texte_type='authors_id';end;
else do;texte=adress_id;texte_type='adress_id';end;
DROP authors_id adress_id;
run;
 
proc sort DATA=b; BY id texte_type;run;
DATA c;  SET b;
BY id texte_type;
IF first.texte_type then num_ordre=1;else num_ordre+1;run;
proc sort DATA=c; BY id num_ordre;run;
 
proc transpose DATA=c out=d(DROP=_name_ num_ordre);
BY id num_ordre;
var texte;
id texte_type;run;
jerome_pdv2 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 00h29.


 
 
 
 
Partenaires

Hébergement Web