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 16/05/2011, 17h11   #1
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Par défaut Table résultante en deux sous tables sur SAS

Bonjour,
La table TEST contient une variable Vi (pour chaque VARi) qui n'a qu'une seule observation.
Selon la valeur de cette observation je veux copier VARi de ma table TAB (qui contient 1000 variables (colonnes à 50 observations)) dans TAB1 (si Vi > VAL) ou dans TAB2 (Vi < VAL).
Jai essayé cela: (j'ai creé une table dep qui contient just VARi)

Code :
1
2
3
4
5
6
7
8
DATA TAB1  TAB2;
SET dep;
SET TEST;
IF Vi > VAL then  output TAB1 ;
DROP V; 
else output TAB2 ;
DROP V; 
run;
il me donne n'importe quoi !! sans erreur dans log.
vouv voyez oû est le probleme???????
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h20   #2
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
Pourquoi as tu 2 instructions set, les données sont-elles situées dans deux fichiers de données? Est ce possible d'avoir toutes tes données dans un même fichier source? Par ailleurs, vu que dep ne contient qu'une variable il serait peut être envisageable de considérer un merge au lieu d'un set.

A première vue je ne vois pas l'intéret du drop V (surtout 2 fois). Tu peux justement met une option drop dans ton instruction set pour ne pas charger cette variable lorsque tu puises dans ton fichier source.

A part cela ta syntaxe ne me semble pas contenir de fautes (sauf que tes deux cas sont: dans TAB1 (si Vi > VAL) ou dans TAB2 (Vi <= VAL)
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h20   #3
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
Le set dep c'est une coquille ou pas?

Code :
1
2
3
4
5
6
7
DATA TAB1  TAB2;
SET dep;SET TEST;
IF Vi > VAL then  output TAB1 ;
drop V; 
else output TAB2 ;
drop V; 
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 21h55   #4
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Citation:
Envoyé par Manoutz Voir le message
Pourquoi as tu 2 instructions set, les données sont-elles situées dans deux fichiers de données? Est ce possible d'avoir toutes tes données dans un même fichier source?
TEST est la table qui contient la V de la variable dep!! et lorsque j'ai tenté de les mettre dans une table (disant TEST_Dep) la variable dep a perdu ses autres observations ! car la V ne contient qu'une seule observation.

Citation:
Envoyé par Manoutz Voir le message
A première vue je ne vois pas l'intéret du drop V (surtout 2 fois).
desolé, ya qu'une seule (celle just avant le run), c etait une faute.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 22h10   #5
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Le set dep c'est une coquille ou pas?
non c est la table qui contient la variable VARi surlaquelle je fais le test et selon sa Vi je decide oû je vais la copier.
j'aurais pu faire:
au lieu de créer une autre table dep et :
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 22h13   #6
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 suppose que c'est ce que tu voudrais:

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
DATA TEST;
INPUT Vi;
CLE=1;
CARDS;
451
;
RUN;
 
DATA TAB;
INPUT VAL;
CLE=1;
CARDS;
451
452
399
500
;
RUN;
 
DATA TAB;
MERGE TAB TEST;
BY CLE;
DROP CLE;
RUN;
 
DATA TAB1  TAB2;
SET TAB;
IF Vi > VAL THEN OUTPUTTAB2 TAB1 ;
ELSE OUTPUTTAB2 ;
RUN;
ps: ton problème de IN avec pleins de variables est résolu? à moins que je confonds...
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 00h43   #7
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Le

a changé un peu , mais le problème persiste, car aprés le IF lorsque je fais:
Code :
1
2
3
4
5
6
DATA SS_TAB1;
SET SS_TAB1 TAB1;
run;
DATA SS_TAB2;
SET SS_TAB2 TAB2;
run;
pour rassebler les variables qui vérifient la même condition sur V,SS_TAB1, par exemple devient comme suit:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
VAR2	VAR5	VAR7	VAR9	VAR12	VARi
14600	11530	10627	9350	12833	
14775	10360	11818	11775	12500	
14333	13200	10963	12595	14000	
......................
14386	13300	11125	11309	10070	
17543	11281	11220	9914	13357	
17450	12705	10980	9563	14500	
					10675
					8906
					13760			
                                        11775
					12595
                                        ...........
Et en ce qui conserne les INN de l'autre discussion, c fait merci!!!
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 08h53   #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
Tu peux faire un SET que lorsque tes 2 tables ont la même structure (même nombre de variables, format,...)
Je te propose de fusionner les deux tables par une clé fictive (cle=1 sur toutes les lignes) afin de ramener V dans l'autre table pour comparer mais visiblement tu n'as pas fait comme je t'ai dit
Tu n'avais pas dit qu'il y a qu'une observation dans la table TEST ?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 10h16   #9
Membre habitué
 
Femme Géraldine CADE DESCHAMPS
Support Clients SAS (France et Europe)
Inscription : février 2010
Messages : 62
Détails du profil
Informations personnelles :
Nom : Femme Géraldine CADE DESCHAMPS
Localisation : France

Informations professionnelles :
Activité : Support Clients SAS (France et Europe)
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 62
Points : 139
Points : 139
Bonjour,

Si j'ai bien compris, on lit une table pour pouvoir éclater une autre table en 2 tables. Je propose d'utiliser des macros variables pour déterminer le KEEP de chacune (avec un CALL EXECUTE on aurait pu en faire autant en une seule étape, mais je sais qu'il a malheureusement peu d'adeptes !). Ensuite on lance l'étape DATA qui permettra de créer les 2 tables, en utilisant ces macros pour le KEEP.

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
/* jeu de test : 
- une table qui contient 1 obs pour chaque Vi : TEST_vi 
- une table qui contient 50 obs pour chaque VARi, qui devront être dispatcher dans TAB1 et TAB2 selon les valeurs de vi : TABLE_vari
*/
DATA TEST_vi;
array a[10] v1-v10  ;
do i=1 TO 10 ;
  a[i]=ceil (20*ranuni(0)) ;
end ;
DROP i ;
RUN;
 
DATA TABLE_vari;
array a[10] var1-var10  ;
do j=1 TO 50 ;
	do i=1 TO 10 ;
	  a[i]=ceil (32*ranuni(0)) ; 
	end ;
	output ;
end ;
DROP i j ;
RUN;
 
 
DATA _null_ ;
	/* On va stocker sous forme de texte la liste des variables pour TAB1 et pour TAB2*/
	length Keep_TAB1 Keep_TAB2 $32000. ;
	retain Keep_TAB1 Keep_TAB2 ;
	array a[10] v1-v10  ;
	SET TEST_vi ;
 
	/* selon vi, on indique dans quelle table ira vari*/
	do i=1 TO 10 ;
	  IF a[i] > 10 then Keep_TAB1=compbl (Keep_TAB1 !! compress("var" !! put (i, 8.)) ) ;
	  else Keep_TAB2=compbl (Keep_TAB2 !! compress("var" !! put (i, 8.)) ) ;
	end ;
	put Keep_TAB1=  Keep_TAB2=;
 
	/* création de macros contenant la liste des variables pour TAB1 et TAB2  */
	call symput ("Keep_TAB1", Keep_TAB1) ;
	call symput ("Keep_TAB2", Keep_TAB2) ;
run ;
 
DATA TAB1 (keep= &Keep_TAB1) 
	 TAB2 (keep= &Keep_TAB2); 
  SET TABLE_vari ;
run ;
est-ce que cela répond à votre problématique ?

Cordialement,
Géraldine CADE-DESCHAMPS
Géraldine_Cade_SAS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 10h17   #10
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
Citation:
La table TEST contient une variable Vi (pour chaque VARi) qui n'a qu'une seule observation.
(j'ai creé une table dep qui contient just VARi)
Avant de faire des sorties vers une table sous condition, il te faut une table qui rassemble les deux types de données dans une même table, et que chaque observation de cette table ait des colonnes VAR2...VAR et VARi (d'ailleurs la table que tu donnes dans ton dernier message n'a pas l'air de correspondre avec ce que tu a écrit auparavant et que j'ai mit en citation).

Chaque ligne de TAB doit regrouper des informations de dep et TEST pour le même identifiant, et apparemment dans dep tu n'as pas d'identifiant (enfin, à ce que je comprends.)

Pourquoi as tu créé ces deux datasets? Peux tu nous faire voir à quoi ils ressemblent?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2011, 18h23   #11
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Voilà ce que j'ai fait:



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%macro separ();
%do i=1 %TO 15325;
DATA LIB1.fish&i; SET LIB1.fish&i (keep=F); CLE=1; RUN;
DATA LIB1.TAB; SET LIB1.SERIE(keep=COL&i); CLE=1; RUN; 
DATA LIB1.TAB; MERGE LIB1.TAB LIB1.fish&i; BY CLE; DROP CLE; RUN; 
DATA LIB1.tab1  LIB1.tab2; 
SET LIB1.TAB;
IF F > 100 THEN OUTPUT LIB1.tab1 ;
ELSE OUTPUT LIB1.tab2 ;
DROP F;
RUN;
DATA LIB1.sais; SET LIB1.sais; CLE1=1;run;
DATA LIB1.nsais; SET LIB1.nsais; CLE1=1;run;
DATA LIB1.tab1; SET LIB1.tab1; CLE1=1; run;
DATA LIB1.tab2; SET  LIB1.tab2; CLE1=1; run;
DATA LIB1.sais; merge  LIB1.sais LIB1.tab1; BY CLE1; DROP CLE1; run;
DATA LIB1.nsais; merge LIB1.nsais LIB1.tab2; BY CLE1; DROP CLE1; run;
%end;
%mend;
%separ();

ça vous parait peut être trop long, mais j'ai eu le resultat.
Merci à tous.
Imfafa 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 12h11.


 
 
 
 
Partenaires

Hébergement Web