2016-09-19 1 views
0

Il s'agit d'un suivi d'un previous question qui ne prenait en compte qu'une seule variable avec deux sous-groupes. Dans cette question, la solution consistait à ordonner les sous-groupes en triant les données. Cette approche, cependant, se décompose lorsqu'il y a plusieurs variables.PROC TABULATE Réorganiser les sous-groupes d'en-tête indépendamment des données

Cela devient un jeu de tri des variables dans une séquence qui produit le résultat désiré. Chaque sous-groupe variable BY suivant dépend des niveaux précédents. Si tous les sous-groupes ne sont pas présents dans un groupe de niveau supérieur, tous les sous-groupes ne peuvent pas être organisés dans l'ordre souhaité. L'PROC TABULATE n'est pas l'outil approprié pour cette tâche (c'est-à-dire l'obtention de pourcentages de divers groupes sur plusieurs variables) ou il existe une technique qui permet d'organiser les sous-groupes indépendamment des données. Est-ce que je vais chercher l'aiguille dans la botte de documentation ou est-ce que je réinvente la roue? Toute idée que vous pourriez me donner serait appréciée.


Exemple:

Pour donner un exemple, dire que je veux créer une table avec les sous-groupes de chaque variable dans l'ordre (Y, N). Notez que var4 n'est pas sorti dans le bon ordre. Au moment où les autres variables ont été triées, il n'y a pas assez de valeurs var4 présentes pour être triées dans l'ordre souhaité.

data example; 
    input group $ var1 $ var2 $ var3 $ var4 $; 
    datalines; 
    1 Y Y N Y 
    1 N Y N N 
    2 Y N Y N 
    2 Y Y Y N 
    3 N N N Y 
    3 N Y Y N 
    ; 
run; 

proc sort data = example out = sorted; 
    by descending var1 
     descending var2 
     descending var3 
     descending var4 
     ; 
run; 

title 'Percent'; 
proc tabulate data = sorted order = data; 
    class group var1 var2 var3 var4; 
    table group='Group', 
      all = 'Total'*pctn='' 
      var1 = 'Variable 1'*pctn='' 
      var2 = 'Variable 2'*pctn='' 
      var3 = 'Variable 3'*pctn='' 
      var4 = 'Variable 4'*pctn=''; 
run; 

Program Output

Il peut être possible de mettre au point une combinaison de BY variables du PROC SORT qui donnent un (Y, N) ordre de sous-groupement, mais cela impliquerait un tas de tripotage qui n'est pas robuste contre changements dans les données. Si la table doit être mise à jour tous les mois, alors chaque mois, vous devrez jouer avec le tri.

Répondre

1

Aucune solution de contournement ou de réinventer la roue nécessaire - ce qui est exactement ce que ClassData ensembles de données sont pour:

data example; 
    input group (var1-var4) ($1. +1); 
    datalines; 
    1 Y Y N Y 
    1 N Y N N 
    2 Y N Y N 
    2 Y Y Y N 
    3 N N N Y 
    3 N Y Y N 
    ; 
run; 

data classtypes; 
    do group = 1 to 3; 
     do var1 = 'Y','N'; 
      do var2 = 'Y','N';  
       do var3 = 'Y','N';     
        do var4 = 'Y','N'; 
         output; 
        end; 
       end; 
      end; 
     end;    
    end; 
run; 

title 'Percent'; 
proc tabulate data = example order = data classdata=classtypes; 
    class group var1 var2 var3 var4; 
    table group='Group', 
      all = 'Total'*pctn='' 
      var1 = 'Variable 1'*pctn='' 
      var2 = 'Variable 2'*pctn='' 
      var3 = 'Variable 3'*pctn='' 
      var4 = 'Variable 4'*pctn=''; 
run; 

En prime, cela évite aussi d'avoir à trier votre ensemble de données d'entrée principal - commande de ligne/colonne dans la sortie La table est déterminée par l'ordre du jeu de données classdata.

+0

Merci. Pour les futurs lecteurs, le '+ 1' de l'instruction' INPUT' est un "contrôle de pointeur de colonne" qui déplace les colonnes de pointeur * n *. Dans ce cas, il déplace le pointeur vers la valeur de données suivante. –

+0

Malheureusement, cette approche ne fonctionne que pour un petit nombre de variables, chacune avec seulement quelques sous-groupes. Cela fonctionne bien pour quatre variables avec deux sous-groupes chacun. Ceci fait que les 'classtypes' ont 48 observations. Mais plus il y a de variables et de sous-groupes, plus le 'classtypes' devient grand. Pour 16 variables avec des sous-groupes de taille 6, 2, 2, 2, 2, 2, 2, 2, 4, 6, 2, 2, 2, 10, 8 et 10 chacune, le tableau 'classtypes 'comporte 117 964 800 observations . Cela me prend 6 minutes pour imprimer la table, en plus des 7 qu'il faut pour générer 'classtypes' lui-même. Et 'classtypes' est 26.2Gb. –

+0

Si vous avez des contraintes sur les combinaisons de valeurs possibles, vous pouvez les coder dans la définition de la classe. Au-delà d'un certain point, je suggérerais de diviser vos données sur un certain nombre de tables plus petites et plus lisibles. – user667489