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 24/01/2011, 12h11   #1
Invité de passage
 
Inscription : mars 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 13
Points : 3
Points : 3
Par défaut Sélection de variables finissant par le même mot

Bonjour à tous,

Je suis une petite nouvelle sur le forum et j'aurai besoin de quelques conseils.

Je cherche à sélectionner dans une étape Data toutes les variables dont le nom finit par la lettre T (par exemple) :

Code :
1
2
3
4
DATA toto;
   SET tata;
   keep toutes_les_variables_finissants_pas_T ;
run;
Je sais que pour sélectionner toutes les variables commançant par T, il faut appliquer la syntaxe T:. Y-a-t-il un équivalent pour le sens inverse ?

Merci pour votre aide.
Maggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 12h52   #2
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
Bienvenue Maggy,
Voici un exemple qui pourrait t'aider !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA TEST;
input NOM $;
CARDS;
BNFGGFG
FFDDT
HGGGHGHGT
PPMLLLT
;
run;
 
DATA TEST;
SET TEST;
IF substr(NOM,length(COMPRESS(NOM)),1)='T';
run;

Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h07   #3
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour; je rajoute juste sa :
si c'est pour selectionner des variables , il faut d'abord récupérer les noms de tes variables dans une table sas et appliquer par la suite la méthode de MEGAMIND2;

je te propose :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
proc contents DATA=MaTable noprint out=contenu;
 
run;
 
 
DATA mes_variables;
SET contenu;
IF substr(name,length(COMPRESS(name)),1)='T';
run;[/

Citation:
Envoyé par MEGAMIND2 Voir le message
Bienvenue Maggy,
Voici un exemple qui pourrait t'aider !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA TEST;
input NOM $;
CARDS;
BNFGGFG
FFDDT
HGGGHGHGT
PPMLLLT
;
run;
 
DATA TEST;
SET TEST;
IF substr(NOM,length(COMPRESS(NOM)),1)='T';
run;

Brice
  Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h40   #4
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
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 791
Points : 4 012
Points : 4 012
Sans plus d'explications sur ton contextetu fais cela si tu veux

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
proc contents DATA=sashelp.class out=cnt (keep=name) noprint;
run;
 
proc sql ;
SELECT DISTINCT name INTO : list separated BY ' '
FROM cnt
WHERE upcase(first(reverse(trim(name))))  = 'T'
;
quit;
 
DATA final;
SET sashelp.class;
keep &list;
run;
__________________
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 24/01/2011, 13h42   #5
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
+1 rose,

la solution de megamind fonctionne pour les observations et non les variables. La proc contents est un palliatif. Pour ma part, pour la deuxiéme étape (l'étape data) je serais parti vers une approche en utilisant la fonction reverse.. l'important est le résultat.

pour en revenir au problème initial, stocker la liste de variable à l'issu de l'étape data (une proc sql par exemple...) permettra de retourner au jeu de données initial et d'y appliquer le filtre approprié
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h47   #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
Citation:
Envoyé par Manoutz Voir le message
+1 rose,

la solution de megamind fonctionne pour les observations et non les variables. La proc contents est un palliatif. Pour ma part, pour la deuxiéme étape (l'étape data) je serais parti vers une approche en utilisant la fonction reverse.. l'important est le résultat.

pour en revenir au problème initial, stocker la liste de variable à l'issu de l'étape data (une proc sql par exemple...) permettra de retourner au jeu de données initial et d'y appliquer le filtre approprié

Tu as raison Manoutz, Voici ce que je te propose. Et merci Julie!


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
DATA TEST;
INPUT NOMT $ PRENOMT $ AGE $;
CARDS;
BNFGG BRE 20
FFDDT BTF 30
HGGGH HUJ 21
PPMLT LIK 06
;
run;
 
PROC CONTENTS DATA=TEST OUT=_NOM;
RUN;
 
PROC SORT DATA=_NOM;
	BY VARNUM;
RUN;
 
DATA _NOM;
	SET _NOM;
	IF substr(NAME,length(COMPRESS(NAME)),1)='T';
RUN;
 
PROC SQL;
	SELECT NAME INTO: L_KEEP SEPARATED BY ' ' FROM _NOM;
 
QUIT;
 
	DATA TEST;
		SET TEST;
		KEEP &L_KEEP.;
	RUN;
Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 19h55   #7
Invité de passage
 
Inscription : mars 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 13
Points : 3
Points : 3
Merci à tous !

J'y avais pensé de passer par la Proc contents.
Mais, j'espérais qu'il y avait une petite astuce plus rapide, du style (pour récupérer toutes les variables commançant par T):

Code :
1
2
3
4
DATA toto;
SET tata;
keep T: ;
run;
J'avais essayé la solution (pour récupérer toutes les variables finissant par T) :

Code :
1
2
3
4
DATA toto;
SET tata;
keep :T;
run;
mais cela aurait trop facile !
Maggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h01   #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
Donc le problème est résolu Maggy?

Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h13   #9
Invité de passage
 
Inscription : mars 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 13
Points : 3
Points : 3
Si personne ne connait l'astuce (je ne suis même pas sûre qu'elle existe), je vais rester sur la méthode avec la proc contents.

Merci à tous
Maggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h23   #10
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
Si jamais tu trouves une solution sans la passer par la proc contents, tu nous diras !
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 12h32   #11
Invité de passage
 
Inscription : mars 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 13
Points : 3
Points : 3
Maggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 12h54   #12
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
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 467
Points : 2 823
Points : 2 823
Bonjour Maggy.
A moins d'une fonctionnalité non documentée, SAS ne propose que les raccourcis suivants pour énumérer des variables.
Ca inclut effectivement les variables "dont le nom commence par" mais c'est tout ; pas "se termine par".
La proc Contents et un peu de SQL pour faire une macro-variable est donc une excellente solution.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/01/2011, 15h18   #13
Invité de passage
 
Inscription : mars 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 13
Points : 3
Points : 3
Merci pour la doc
Maggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h23   #14
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par MEGAMIND2 Voir le message
Si jamais tu trouves une solution sans la passer par la proc contents, tu nous diras !
à adapter
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 %macro mac;
 
%let dsid=%sysfunc(open(Sashelp.class,i));
%let varlist=;
%do i=1 %TO %sysfunc(attrn(&dsid,nvars));
/* ici on récupère les variables dont le type est caracère , N pour numérique*/
 
  %IF (%sysfunc(vartype(&dsid,&i)) = C) %then
     %let varlist=&varlist %sysfunc(varname(&dsid,&i));
 
 
%end;   %put variable caractère ***** &varlist.;
%let rc=%sysfunc(close(&dsid));
%mend;
 
%mac;

Dernière modification par Invité ; 28/01/2011 à 15h40.
  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 04h06.


 
 
 
 
Partenaires

Hébergement Web