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 09/12/2011, 12h41   #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 Réduction du temps de traitement

Bonjour,

J'ai un code qui me permet de transformer une table avec plusieurs lignes pour une même observation en un table avec une seule ligne par observation mais des variables supplémentaires. Comme un bon exemple vaut toujours mieux que des tonnes d'explications, voici :

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
DATA test;
INPUT Id Nom $ Poids Taille Mois $ Sexe $ Ville $;
CARDS;
1 Marie 7.1 70 Janv F Paris
1 Marie 7.6 73 Fevr F Paris
1 Marie 8.0 76 Mars F Paris
1 Marie 8.4 79 Avri F Paris
2 Paul 6.2 65 Janv M Lyon
2 Paul 6.4 68 Fevr M Lyon
2 Paul 6.9 70 Mars M Lyon
2 Paul 7.2 73 Avri M Lyon
3 Gabriel 6.5 52 Janv M Marseille
3 Gabriel 6.6 55 Fevr M Marseille
3 Gabriel 6.9 59 Mars M Marseille
3 Gabriel 7.1 63 Avri M Marseille
;
RUN;
 
 
PROC CONTENTS 	DATA = test OUT = colonne NOPRINT;
RUN;
 
PROC SQL NOPRINT;
SELECT name INTO :var separated BY ' ' FROM colonne
			WHERE name NOT IN ("Sexe" "Nom" "Id" "Mois" "Ville");
QUIT;
 
PROC SORT 	DATA = test
			OUT = test1;
	BY _ALL_;
RUN;
 
PROC TRANSPOSE 	DATA = test1 OUT = test1;
	BY _ALL_;
	VAR &var.;
RUN;
 
DATA test1;
SET test1;
	new_var = compress(_name_!!'_'!!mois);
RUN;
 
PROC SORT DATA = test1;
	BY id;
RUN;
 
PROC TRANSPOSE 	DATA = test1
				OUT = test1;
	BY id;
	VAR col1;
	ID new_var;
	COPY _ALL_;
RUN;
 
DATA Test1 (DROP = _name_ poids taille mois _label_ col1 &var. new_var);
 
SET test1;
	IF poids_janv = . THEN DELETE;
RUN;
Le code fait exactement ce que j'attends mais le temps de traitement est vraiment trop long (ma table réelle comporte près de 50 000 observations et 20 variables à transposer) !

Pourriez-vous m'aider à transformer le code, peut-être avec un ARRAY (?), de sorte à diminuer le temps de traitement ?

Merci, merci !
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 13h17   #2
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
pourtant ta table "test" est tres bien comme ca.

pourquoi tu voudrais la transformer?

X
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/12/2011, 14h48   #3
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
Effectivement transposer de grosses tables peut demander beaucoup de ressources (mémoires).

Tu peux le faire avec une étape data et des retains
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 sort DATA=test; BY id mois; run;
 
DATA test2(DROP=poids taille);
SET test;
retain taille_Fevr taille_Janv taille_Mars taille_Avri
 poids_Fevr poids_Janv poids_Mars poids_Avri;
BY id;
IF mois="Avri" then do;
		taille_avri=taille ;
		poids_avri=poids;
end;
IF mois="Fevr" then do;
		taille_Fevr=taille ;
		poids_Fevr=poids;
end;
IF mois="Janv" then do;
		taille_Janv=taille ;
		poids_Janv=poids;
end;
IF mois="Mars" then do;
		taille_Mars=taille ;
		poids_Mars=poids;
end;
 
IF last.id 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 09/12/2011, 15h02   #4
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
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 : 213
Points : 319
Points : 319
Bonjour, et re sur ce problème,

dans le même ordre d'idée que Bahraoui retain+array ,
cela devrait se "macro-iser" assez facilement

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
 
DATA test;
INPUT Id Nom $ Poids Taille Mois $ Sexe $ Ville $;
CARDS;
1 Marie 7.1 70 Janv F Paris
1 Marie 7.6 73 Fevr F Paris
1 Marie 8.0 76 Mars F Paris
1 Marie 8.4 79 Avri F Paris
2 Paul 6.2 65 Janv M Lyon
2 Paul 6.4 68 Fevr M Lyon
2 Paul 6.9 70 Mars M Lyon
2 Paul 7.2 73 Avri M Lyon
3 Gabriel 6.5 52 Janv M Marseille
3 Gabriel 6.6 55 Fevr M Marseille
3 Gabriel 6.9 59 Mars M Marseille
3 Gabriel 7.1 63 Avri M Marseille
;
RUN;
proc sort DATA=test; BY id ;
DATA test1;
SET test;
BY id;
retain Poids1-Poids4 Taille1-Taille4;
array var1 {2} Poids Taille;
array var2 {2,4} Poids1-Poids4 Taille1-Taille4;
IF first.id then goto init;else goto cour;
init:
do i=1 TO 2;do j=1 TO 4;
var2(i,j)=.;
end;end;
cour:
do i=1 TO 2;
IF mois='Janv' then var2(i,1)=var1(i);
IF mois='Fevr' then var2(i,2)=var1(i);
IF mois='Mars' then var2(i,3)=var1(i);
IF mois='Avri' then var2(i,4)=var1(i);
end;
IF last.id ;
DROP i j taille poids;
run;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 18h24   #5
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.

Cependant :
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
PROC CONTENTS DATA = test OUT = colonne NOPRINT;
RUN;
 
PROC SQL NOPRINT;
SELECT name INTO :var separated BY ' ' FROM colonne
   WHERE name NOT IN ("Sexe" "Nom" "Ville" "Id" "Mois");
QUIT;
 
PROC SORT DATA = test;
   BY id;
RUN;
 
DATA test;
SET test;
    BY id;
    RETAIN Poids1-Poids4 Taille1-Taille4;
    ARRAY var1 {*} &var.;
    ARRAY var2 {2,4} Poids1-Poids4 Taille1-Taille4;
        IF first.id THEN GOTO init;
        ELSE GOTO cour;
 
  init:
  DO i=1 TO 2;
  DO j=1 TO 4;
      var2(i,j) = .;
  END;
  END;
 
  cour:
  DO i=1 TO 2;
      IF mois='Janv' then var2(i,1)=var1(i);
      IF mois='Fevr' then var2(i,2)=var1(i);
      IF mois='Mars' then var2(i,3)=var1(i);
      IF mois='Avri' then var2(i,4)=var1(i);
  END;
 
IF last.id ;
DROP i j mois &var.;
 
RUN;
De la même façon que je l'ai fait pour le premier array, n'y a t il pas un moyen d'automatiser la saisie du deuxième array ? Ou bien dois-je prendre mon mal en patience et saisir les 25 (x2) variables manuellement ?
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h03   #6
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
pourtant ta table "test" est tres bien comme ca.

pourquoi tu aurais besoin de la vouloir dans l'autre sens?

X
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 09h58   #7
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
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 : 213
Points : 319
Points : 319
Bonjour

Il y a toujours moyen d'automatiser.

Où en es tu à présent ?
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 22h13.


 
 
 
 
Partenaires

Hébergement Web