2016-09-19 111 views
0

这是后续到previous question,它仅考虑具有两个子组的单个变量。在这个问题中,解决方案是通过排序数据来排序子组。PROC TABULATE独立于数据的重新排列标题子组

但是,这种方法在存在多个变量时发生故障。它变成了将变量分类成产生期望结果的序列的重要组成部分。每个后续BY变量子组取决于以前的级别。如果不是所有的子组都存在于更高级别的组中,则不是所有的子组都可以按照期望的顺序排列。

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

我是否要在文档草垛中挖针,还是要重新发明轮子?任何你可以给我的见解将不胜感激。


实施例:

为了给出一个例子,说我想创建一个表与布置在(Y,N)顺序中的每个变量的子组。请注意,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变量,其中得到(Y,N)子分组顺序PROC SORT组合,但它会涉及一串摆弄的这是不针对鲁棒数据的变化。如果表格需要每月更新一次,那么每个月你都必须摆弄排序。

回答

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数据集的顺序决定。

+0

谢谢。对于将来的读者,INPUT语句中的'+ 1'是移动指针* n *列的“列指针控制”。在这种情况下,它将指针移动到下一个数据值。 –

+0

不幸的是,这种方法仅适用于少数变量,每个变量只有少数几个子组。它适用于四个变量和两个子组。这使得'classtypes'有48个观测值。但是,变量和子群越多,'classtypes'变得越大。对于16个具有大小分别为6,2,2,2,2,2,2,2,2,4,6,2,2,2,10,8和10的子组的变量的变量,“分类型”表具有117,964,800个观察值。除了生成'classtypes'所需的7分钟之外,这需要6分钟来打印表格。而'classtypes'是26.2Gb。 –

+0

如果您对可能的值的组合有限制,您可以将它们编码到classdata定义中。除了某个特定点之外,我建议将数据分成多个更小,更易读的表格。 – user667489