|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Conseil - Consultant en systèmes d'information Inscription : mars 2011 Messages : 23 ![]() |
Bonjour à tous,
Je suis débutant en SAS. J'ai effectué une proc tabulate pour obtenir la fréquence de chaque valeurs d'une variable. Cela fonctionne mais je voudrais savoir si il était possible d'obtenir que les 20 premiers enregistrement du résultat. VOici mon code Code :
|
||
|
|
00
|
|
|
#2 | ||||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Salut.
On pourrait bien insérer directement un WHERE au niveau de l'option OUT, qui ne garderait que les 20 premières lignes : (WHERE=(MONOTONIC()<=20)) mais ce qui me chagrine, c'est que la table en sortie n'est pas réellement triée -- en tout cas d'une manière générale. Je m'explique : imaginons que tu fasses un tableau AGE * SEXE. En mettant des ORDER=FREQ dans les instructions CLASS de AGE et SEXE, tu demandes bien à SAS de présenter le tableau par effectifs décroissants. Mais il est obligé de choisir un ordre de présentation global : par exemple pour SEXE, il va ordonner en fonction des effectifs dans la 1e tranche d'âge, et il n'en changera plus ensuite. Code :
Une solution plus propre serait donc de reprendre ta table en sortie, intégrale, de la trier selon les fréquences décroissantes et de ne garder que les 20 premières lignes du résultat. Par exemple en SQL (ou en requête puisque tu sembles dans SEG). Code :
Olivier |
||||
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() Conseil - Consultant en systèmes d'information Inscription : mars 2011 Messages : 23 ![]() |
Tout d'abord, merci pour ta réponse.
J avais justement conscience du problème que tu as mentionné. Et j'avais déjà réfléchis à diverses solutions alternatives mais ce qui m a séduit avec la proc tabulate c'est la rapidité du temps de réponse ainsi que la mise en page du rapport automatique (enterprise guide). Sinon sachant que je suis sous Guide n'y a-t-il pas un moyen d'obtenir une mise en page du même type à partir d'une table SAS quelconque sans forcément passer par la Tabulate ? (pour de grosses table elle me renvoie des résultats inutile et polluant le rapport) |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Du coup j'ai envie de te proposer de reprendre les mêmes ingrédients mais dans un ordre différent :
données --> requête avec agrégation (calcul d'effectifs avec COUNT, rôle de GROUPE pour les autres variables concernées), tri par effectifs décroissants et limitation du nombre de lignes en sorties --> Tabulate pour mettre en forme cette table-là Mais si tu veux une mise en forme sexy, malheureusement il n'y a pas beaucoup de procédures SAS à disposition : PRINT (un peu), TABULATE (l'aspect tableau croisé) et REPORT (celle que le gouvernement intersidéral appelle quand il n'est plus capable de trouver une solution à ses problèmes, quand il ne reste plus aucun espoir, et que même le Capitaine Flam a échoué). |
|
|
10
|
|
|
#5 | ||
|
Invité de passage
![]() Conseil - Consultant en systèmes d'information Inscription : mars 2011 Messages : 23 ![]() |
Effectivement, cette méthode fonctionne bien.
Mais sur des tables plus grosse la succession de requêtes imbriquées et de count pose certains problème de mémoire et de performance. Pour ceux que ça intéresse j ai donc procédé comme suit : table source --> proc tabultate (pour calculer la fréquence) -->plusieurs requêtes sql de type : Code :
--> et enfin proc print c'est très moche je vous l'accorde mais ça marche (j ai fait une croie sur ma mise en page sexy :p) |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com