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 08/02/2012, 09h52   #1
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Par défaut Total de ligne pour chaque variable

Bonjour,

Je dispose de la table suivante dans laquelle il manque quelques valeurs, notament dans les lignes "Total" :
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
 
DATA Test;
INPUT Ordre Id Semaine Jour $ Var1 Var2 Var3 Var4;
CARDS;
1 1 1 Total 174 117 89 143
2 1 1 Lundi 31 13 48 13
3 1 1 Mardi 21 9 9 23
4 1 1 Mercredi 18 48 2 6
5 1 1 Jeudi 5 31 13 2
6 1 1 Vendredi 25 2 6 21
7 1 1 Samedi 24 2 6 50
8 1 1 Dimanche 50 12 5 28
9 1 2 Total 172 168 . 179
10 1 2 Lundi 25 3 26 19
11 1 2 Mardi 34 21 49 7
12 1 2 Mercredi 36 43 . 19
13 1 2 Jeudi 35 15 24 14
14 1 2 Vendredi 21 29 19 45
15 1 2 Samedi 16 47 18 38
16 1 2 Dimanche 5 10 4 37
17 2 1 Total 202 . 149 208
18 2 1 Lundi 47 48 46 37
19 2 1 Mardi 36 . 8 11
20 2 1 Mercredi 15 9 5 21
21 2 1 Jeudi 14 8 17 34
22 2 1 Vendredi 44 . 44 17
23 2 1 Samedi 25 29 0 40
24 2 1 Dimanche 21 9 29 48
25 2 2 Total 260 145 151 .
26 2 2 Lundi 49 3 3 .
27 2 2 Mardi 10 24 5 .
28 2 2 Mercredi 22 28 50 42
29 2 2 Jeudi 50 25 19 16
30 2 2 Vendredi 33 14 21 15
31 2 2 Samedi 49 5 18 8
32 2 2 Dimanche 47 46 35 3
;
RUN;
J'aimerais combler ces vides en calculant les valeurs, c'est à dire en faisant la somme des lignes de la semaine, et ce pour chaque variable :
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
DATA Test1;
INPUT Ordre Id Semaine Jour $ Var1 Var2 Var3 Var4;
CARDS;
1 1 1 Total 174 117 89 143
2 1 1 Lundi 31 13 48 13
3 1 1 Mardi 21 9 9 23
4 1 1 Mercredi 18 48 2 6
5 1 1 Jeudi 5 31 13 2
6 1 1 Vendredi 25 2 6 21
7 1 1 Samedi 24 2 6 50
8 1 1 Dimanche 50 12 5 28
9 1 2 Total 172 168 140 179
10 1 2 Lundi 25 3 26 19
11 1 2 Mardi 34 21 49 7
12 1 2 Mercredi 36 43 0 19
13 1 2 Jeudi 35 15 24 14
14 1 2 Vendredi 21 29 19 45
15 1 2 Samedi 16 47 18 38
16 1 2 Dimanche 5 10 4 37
17 2 1 Total 202 103 149 208
18 2 1 Lundi 47 48 46 37
19 2 1 Mardi 36 0 8 11
20 2 1 Mercredi 15 9 5 21
21 2 1 Jeudi 14 8 17 34
22 2 1 Vendredi 44 0 44 17
23 2 1 Samedi 25 29 0 40
24 2 1 Dimanche 21 9 29 48
25 2 2 Total 260 145 151 84
26 2 2 Lundi 49 3 3 0
27 2 2 Mardi 10 24 5 0
28 2 2 Mercredi 22 28 50 42
29 2 2 Jeudi 50 25 19 16
30 2 2 Vendredi 33 14 21 15
31 2 2 Samedi 49 5 18 8
32 2 2 Dimanche 47 46 35 3
;
RUN;
Pour ce faire, j'ai ce 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
 
PROC CONTENTS DATA = test OUT = colonne NOPRINT; RUN;
 
PROC SQL NOPRINT;
	SELECT name INTO :var separated BY ' ' FROM colonne WHERE name LIKE 'Var%';
	SELECT count (*) INTO :nbr FROM colonne WHERE name LIKE 'Var%';
QUIT; 
 
PROC SORT DATA = test; BY Id Semaine descending ordre; RUN;
 
DATA test1;
SET test;
	ARRAY x {&nbr.} &var.;
	DO i = 1 TO &nbr.;
		IF x(i) = . THEN x(i) = 0;
		temp = x(i);
 
		BY Id Semaine;
		RETAIN somme 0;
		IF Semaine NE LAG(Semaine) THEN somme = temp;
		ELSE IF Jour NE "Total" THEN somme = somme + temp;
		ELSE IF Jour = "Total" THEN temp = somme;
		x(i) = temp;
 
		DROP somme temp;
	END;
RUN;
Le problème est qu'il ne fait pas la somme de chaque ligne d'une même semaine pour chaque variable mais la somme de chaque ligne d'une même semaine de TOUTES les variables.
Je ne vois pas comment résoudre le problème, si ce n'est avec une macro avec un paramètre "Variable" qui prend le nom de chaque variable (donc 4 exécutions de la macro consécutives).
Cette méthode fonctionne mais elle prend énormément de temps puisque j'ai une centaine de variables à traiter !

Une autre idée ?!

Merci à vous.
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h30   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
Pourquoi tu ne calculerais pas TOTAL par toi-même et que tu le remettrais dans la table par un UPDATE SQL par exemple ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h15   #3
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 215
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 : 215
Points : 320
Points : 320
Bonjour,

Tu peux tout simplement tout recalculer directement par une proc summary non ?

Enfin si ton fichier est "propre" comme il semble l'être dans ton exemple.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
proc summary DATA=test(WHERE=(jour^='Total')) ;
class ordre id semaine jour;
var var1-var4;
types id*semaine ordre*id*semaine*jour;
output out=totalise sum=;
run;
 
proc sort DATA=totalise; BY id semaine ordre;run;
 
DATA totalise; SET totalise;
ordre=_n_;
IF _type_=6 then jour='Total';
DROP _type_ _freq_;run;
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
 
       Obs    Ordre    Id    Semaine    Jour        Var1    Var2    Var3    Var4
 
              1       1      1       1       Total        174     117      89     143
              2       2      1       1       Lundi         31      13      48      13
              3       3      1       1       Mardi         21       9       9      23
              4       4      1       1       Mercredi      18      48       2       6
              5       5      1       1       Jeudi          5      31      13       2
              6       6      1       1       Vendredi      25       2       6      21
              7       7      1       1       Samedi        24       2       6      50
              8       8      1       1       Dimanche      50      12       5      28
              9       9      1       2       Total        172     168     140     179
             10      10      1       2       Lundi         25       3      26      19
             11      11      1       2       Mardi         34      21      49       7
             12      12      1       2       Mercredi      36      43       .      19
             13      13      1       2       Jeudi         35      15      24      14
             14      14      1       2       Vendredi      21      29      19      45
             15      15      1       2       Samedi        16      47      18      38
             16      16      1       2       Dimanche       5      10       4      37
             17      17      2       1       Total        202     103     149     208
             18      18      2       1       Lundi         47      48      46      37
             19      19      2       1       Mardi         36       .       8      11
             20      20      2       1       Mercredi      15       9       5      21
             21      21      2       1       Jeudi         14       8      17      34
             22      22      2       1       Vendredi      44       .      44      17
             23      23      2       1       Samedi        25      29       0      40
             24      24      2       1       Dimanche      21       9      29      48
             25      25      2       2       Total        260     145     151      84
             26      26      2       2       Lundi         49       3       3       .
             27      27      2       2       Mardi         10      24       5       .
             28      28      2       2       Mercredi      22      28      50      42
             29      29      2       2       Jeudi         50      25      19      16
             30      30      2       2       Vendredi      33      14      21      15
             31      31      2       2       Samedi        49       5      18       8
             32      32      2       2       Dimanche      47      46      35       3

Tu peux ensuite fignoler, en remplaçant les valeurs manquantes qui restent dans tes variables par des 0.
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 12h21   #4
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
@datametric : Parce que j'ai 70 000 observations et que les valeurs manquantes sont aléatoirement réparties entre les variables !!!

@jerome_pdv2 : Merci, je ne connaissais pas cette proc. Je teste et vous tiens au courant.

Merci !
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h30   #5
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 472
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 472
Points : 2 835
Points : 2 835
Citation:
Envoyé par Hélixe Voir le message
Merci, je ne connaissais pas cette proc.
Pour info c'est la même que la proc MEANS avec une option NOPRINT.

De mon côté, si je dois manipuler la variable _TYPE_, je préfère autant qu'elle soit en texte (valeurs 0 et 1 selon les variables de CLASS utilisées pour ce niveau de groupement) plutôt qu'en binaire. J'ajoute donc CHARTYPE dans la proc MEANS ou SUMMARY et le code devient :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
proc summary DATA=test(WHERE=(jour^='Total'))
             CHARTYPE ;
class ordre id semaine jour;
var var1-var4;
types id*semaine ordre*id*semaine*jour;
output out=totalise sum=;
run;
 
proc sort DATA=totalise; BY id semaine ordre;run;
 
DATA totalise; SET totalise;
ordre=_n_;
IF _type_="0110" then jour='Total';
DROP _type_ _freq_;run;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 21h33   #6
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
@Helixe : la méthode de Jérôme consiste à recalculer les sous-totaux hebdomadaires comme je te le proposais. Qu'importe qu'ils soient manquants aléatoirement ou non, les nouveaux remplaceront les anciens.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 10h33   #7
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Merci à vous tous,
Ca marche bien effectivement.
Par contre, y a t il un nombre de lignes limites pouvant être traitées ?
Parce que mon fichier contient 64800 lignes et la proc summary supprime les 1800 dernières (environs).
Y'a t il un moyen de contourner ce problème ?
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 11h02   #8
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
Qu'entends tu par "supprimer" ? c'est à la lecture ou au final ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 11h29   #9
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 215
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 : 215
Points : 320
Points : 320
Citation:
Envoyé par Hélixe Voir le message
Merci à vous tous,
Ca marche bien effectivement.
Par contre, y a t il un nombre de lignes limites pouvant être traitées ?
Parce que mon fichier contient 64800 lignes et la proc summary supprime les 1800 dernières (environs).
Y'a t il un moyen de contourner ce problème ?
La proc summary n'est pas forcément optimale, mais généralement assez costaud, ça dépend de ta configuration, j'ai eu en sortie plus de 10 millions de croisements déjà..., après ça dépend de ta configuration et plus particulièrement du paramètre "memsize".

Par contre si tu as des choses qui disparaissent sans erreurs dans la log, c'est peut-être que tu as des valeurs manquantes dans l'une ou plusieurs des variables de l'instruction class

Code :
class ordre id semaine jour;
Tu peux rajouter missing dans l'appel de la procèdure pour voir ?

Code :
proc summary DATA=test(WHERE=(jour^='Total'))  MISSING;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h57.


 
 
 
 
Partenaires

Hébergement Web