PROC TABULATE重新排列标题子组,与数据无关

时间:2016-09-19 20:37:11

标签: sorting sas proc

这是对previous question的跟进,它只考虑了一个带有两个子组的变量。在该问题中,解决方案是通过对数据进行排序来对子组进行排序。

然而,当存在多个变量时,这种方法就会崩溃。它变成了将变量分类成产生所需结果的序列的重要因素。每个后续BY变量子组都取决于之前的级别。如果并非所有子组都存在于更高级别的组中,则并非所有子组都可以按所需顺序排列。

PROC TABULATE不是适合此任务的工具(即获得跨多个变量的各种组的百分比),或者有一种技术允许子组独立于数据进行排列。

我是否需要在文档大海捞针中挖针?还是重新发明轮子?你能给我的任何见解都会受到赞赏。

示例:

为了举例说明,我想创建一个表,其中每个变量的子组以(Y,N)顺序排列。请注意var4如何以正确的顺序输出。在对其他变量进行排序时,没有足够的var4值存储在所需的顺序中。

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

有可能在BY中设计PROC SORT变量的组合,它们给出(Y,N)子分组顺序,但它会涉及一堆对变化不稳健的摆弄在数据中。如果表需要每月更新一次,那么每个月你都必须摆弄排序。

1 个答案:

答案 0 :(得分:1)

无需解决方法或重新发明所需的轮子 - 这正是classdata数据集的用途:

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;

作为奖励,这也避免了必须对主输入数据集进行排序 - 输出表中的行/列顺序由classdata数据集的顺序决定。