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 30/01/2012, 23h15   #1
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Par défaut Association de couple pour création de ligne unique

Bonjour,

J'ai des données avec des clients qui ont eu plusieurs conjoints et les prestations associées ont été divisées selon des periodes différentes.
Je voudrais répérer ces personnes et les associer en un seul record, dans un premier temps et dans un second procéder à des calculs de prorata s'il y a lieu.
Sachant qu'une personne est à la fois bénéficiaire et conjoint.
J'ai déjà des programmes pour le calcul de prorata s'il y a division entre 2 conjoints mais c'est lorsqu'un troisième fait surface que cela se complique.

Exemple de données :
Cli_ben Cli_conj am_deb_div am_fin_div
138300914 483337663 199505 200401
138300914 190324501 200711 201112
190324501 138300914 200711 201112
371381310 476396316 199809 200005
371381310 680312321 200509 201112
476396316 371381310 199809 200005
483337663 138300914 199505 200401
680312321 371381310 200509 201112

Je voudrais une table comme cela:

138300914 483337663_190324501 199505 201112
190324501 138300914 200711 201112
371381310 476396316_680312321 199809 201112
476396316 371381310 199809 200005
483337663 138300914 199505 200401
680312321 371381310 200509 201112


Merci.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 10h37   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Bonjour,

Il faut transposer la table avec la proc transpose.

Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h11   #3
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Merci de me répondre mais je vois pas comment la proc transpose pourrait m'aider.

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
 
DATA population;
INPUT 
client $ 1-9
conjoint $ 10-19
am_deb_div  $ 20-26
am_fin_div $ 27-33
 
;
DATALINES;
138300914	483337663	199505	200401
138300914	190324501	200711	201112
190324501	138300914	200711	201112
371381310	476396316	199809	200005
371381310	680312321	200509	201112
476396316	371381310	199809	200005
483337663	138300914	199505	200401
680312321	371381310	200509	201112
;
RUN;
 
proc sort DATA=population;
BY client conjoint;
run;
 
proc transpose DATA=population out=pop_trans;
BY client conjoint;
run;
Mon but ultime est le suivant:

Pour les clients avec plus de deux conjoints d'associer ces conjoints dans une nouvelle variable (ou la variable conjoint existante).
Sa date de début de division sera le minimum des dates (la sienne, le conjoint1, le conjoint2) et sa date de fin le maximum des dates (la sienne, le conjoint1, le conjoint2).

Ma table finale ressemblerai à cela:

Code :
1
2
3
4
5
6
7
8
9
 
 
Client 	     Conjoint	                date_deb_div               date_fin_div
138300914  483337663_190324501	    199505                      201112
190324501  138300914	                 200711	          201112
371381310  476396316_680312321	    199809	          201112
476396316  371381310	                 199809	          200005
483337663  138300914	                 199505	          200401
680312321  371381310	                 200509	          201112
Merci.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 15h47   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Avec la proc transpose c'est compliqué
Je te propose le code suivant:
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
33
34
35
36
37
38
39
40
41
42
43
 
DATA population;
INPUT 
client $ 1-9
conjoint $ 10-19
am_deb_div  $ 20-26
am_fin_div $ 27-33
 
;
DATALINES;
138300914	483337663	199505	200401
138300914	190324501	200711	201112
190324501	138300914	200711	201112
371381310	476396316	199809	200005
371381310	680312321	200509	201112
476396316	371381310	199809	200005
483337663	138300914	199505	200401
680312321	371381310	200509	201112
;
RUN;
 
proc sort DATA=population;
BY client conjoint;
run;
 
DATA t(DROP=conjoint am_deb_div am_fin_div); SET work.population;
BY client;retain clientcon min_am_deb_div max_am_fin_div;
format clientcon $100.;
IF first.client then do ;
		clientcon=compress(conjoint);
		min_am_deb_div=am_deb_div;
		max_am_fin_div=am_fin_div;
end;
else do;
	clientcon=compress(conjoint||clientcon);
	IF am_deb_div>min_am_deb_div then am_deb_div=min_am_deb_div;
	else min_am_deb_div=am_deb_div;
	IF am_fin_div>max_am_fin_div then am_fin_div=max_am_fin_div;
	else max_am_fin_div=am_fin_div;
 
	output;
end;
run;
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 16h28   #5
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Merci pour ta réponse, le résultat ne semble pas correspondre à celui souhaité...j'ai fouillé pour la proc transpose (ta première intuition était bonne) et elle peut répondre au besoin.
Voici le code :
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
33
34
35
36
37
 
 
proc sort DATA=population;
BY client ;
run;
 
DATA pop2;
SET population;
BY client ;
IF FIRST.client then compteur=0;
compteur+1;
nomvar=COMPRESS("Conjoint"!!compteur);
valeur=conjoint;
output;
 
nomvar=COMPRESS("date_deb_div"!!compteur);
valeur= am_deb_div ;
output;
 
nomvar=COMPRESS("date_fin_div"!!compteur);
valeur= am_fin_div  ;
output;
 
RUN;
 
proc transpose DATA=pop2 out=pop_trans (DROP= _name_);
BY client ;
var valeur ;
id nomvar;
run;
 
DATA pop_trans2;
SET pop_trans;
Conjoints=compress(conjoint1!!conjoint2);
date_deb_ret=min(date_deb_div1,date_deb_div2);
date_fin_ret=max(date_fin_div1,date_fin_div2);
run;
Ma nouvelle question est la suivante comment récupérer mon compteur sur une colonne (dans la table pop_trans) pour que je puisse utiliser sa valeur par la suite.
Car à pripori je ne connais pas le nombre de conjoint potentiel.

PS: Merci au document "la proc transpose expliqué à ma fille" d'Olivier.
Merci.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 16h57   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
pourquoi le résultat n'est pas bon?
tu peux me donner le résultat souhaiter à partir des données que j'ai utilisé dans mon exemple?
tu peux me donner le cas ou il y a plusieurs conjoints?
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 17h09   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
je crois que c'est bon cette fois ci
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 t(DROP=conjoint am_deb_div am_fin_div); SET work.population;
BY client;retain clientcon min_am_deb_div max_am_fin_div;
format clientcon $100.;
IF first.client then do ;
		clientcon=compress(conjoint);
		min_am_deb_div=am_deb_div;
		max_am_fin_div=am_fin_div;
end;
else do;
 
		clientcon=compress(conjoint||clientcon);
		IF am_deb_div>min_am_deb_div then am_deb_div=min_am_deb_div;
		else min_am_deb_div=am_deb_div;
		IF am_fin_div<max_am_fin_div then am_fin_div=max_am_fin_div;
		else max_am_fin_div=am_fin_div;
		output;
 
end;
	IF first.client = last.client then output;
 
run;
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 17h11   #8
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
La table T donne le résultat suivant :

138300914 190324501 483337663 199505 200401
371381310 680312321 476396316 199809 200005

Les deux lignes précédentes sont celles où il ya deux conjoints, mais j'ai pas la bonne date maximum de fin.
Pour 138300914 devra avoir pour date min 119505 et max 201112
Pour 371381310 devra avoir pour date min 199809 et max 201112

Je perds les observations suivantes:


Et je perd le reste de mes obervations :

190324501 138300914 200711 201112
476396316 371381310 199809 200005
483337663 138300914 199505 200401
680312321 371381310 200509 201112
190324501 138300914 200711 201112

Merci.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 17h15   #9
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Citation:
Envoyé par bahraoui Voir le message
je crois que c'est bon cette fois ci
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 t(DROP=conjoint am_deb_div am_fin_div); SET work.population;
BY client;retain clientcon min_am_deb_div max_am_fin_div;
format clientcon $100.;
IF first.client then do ;
		clientcon=compress(conjoint);
		min_am_deb_div=am_deb_div;
		max_am_fin_div=am_fin_div;
end;
else do;
 
		clientcon=compress(conjoint||clientcon);
		IF am_deb_div>min_am_deb_div then am_deb_div=min_am_deb_div;
		else min_am_deb_div=am_deb_div;
		IF am_fin_div<max_am_fin_div then am_fin_div=max_am_fin_div;
		else max_am_fin_div=am_fin_div;
		output;
 
end;
	IF first.client = last.client then output;
 
run;
Cette solution marche.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 20h26   #10
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
La solution avec le data et la proc transpose donne la même configuration de données en sorties avec mes observations cependant il ya une légère différences de records (j'ignore pour le moment pourquoi...peut être des doublons).

Citation:
Ma nouvelle question est la suivante comment récupérer mon compteur sur une colonne (dans la table pop_trans) pour que je puisse utiliser sa valeur par la suite.
Car à pripori je ne connais pas le nombre de conjoint potentiel.
La question ci-dessus reste de mise, merci pour votre aide.
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 14h33   #11
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
Citation:
Envoyé par MDsas Voir le message
La solution avec le data et la proc transpose donne la même configuration de données en sorties avec mes observations cependant il ya une légère différences de records (j'ignore pour le moment pourquoi...peut être des doublons).


La question ci-dessus reste de mise, merci pour votre aide.
J'ai fini par trouver une solution :
Code :
1
2
3
4
5
6
7
8

data _null_;
set table;
%global ind;
Array conjoint (*)   conjoint:;
call symput("ind", dim(conjoint));
run;
Merci
MDsas 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 07h06.


 
 
 
 
Partenaires

Hébergement Web