在SAS中等效的Access交叉表查询?

时间:2010-08-09 19:47:20

标签: sas

这是我的输入:

ID  Color
1   green
1   red
1   orange
1   green
1   red
2   red
2   red
2   blue
3   green
3   red

这是我在输出中想要的内容 - 每种颜色的ID记录计数:

ID  green  red  orange blue
1   2      2    1      0
2   0      2    0      1
3   1      1    0      0

我知道我可以使用proc freq获取信息,但我想输出一个与我上面写的完全相同的数据集。我似乎无法弄清楚如何使颜色成为此输出数据集中的列。

4 个答案:

答案 0 :(得分:5)

首先,生成数据。

data data;
    format ID 8. Color $8.;
    input id color;
datalines;
1   green
1   red
1   orange
1   green
1   red
2   red
2   red
2   blue
3   green
3   red
run;

接下来,按ID汇总颜色计数。

proc freq data=data noprint;
    table id*color / out=freq;
run;

让桌子平整。

proc transpose data=freq out=freq_trans(drop=_:);
    id color;
    by id;
    var count;
run;

可选地,用0填充缺失的单元格。

data freq_trans_filled;
    set freq_trans;
    array c(*) green red orange blue;
    do i = 1 to dim(c);
        if c[i]=. then c[i]=0;
    end;
    drop i;
run;

答案 1 :(得分:2)

您可以使用SPARSE PROC FREQ语句的TABLE选项用零填充缺少的单元格。这样,您就不需要另一个DATA步骤。颜色的顺序也可以通过ORDER=的{​​{1}}选项来控制。

PROC FREQ

答案 2 :(得分:1)

我从未成为proc转置的粉丝,因为我永远不会记住语法。这是使用proc sql和宏变量的方法。

proc sql noprint;  
    select    sum(color = '" || trim(color) || "') as " || color into: color_list separated by ", "
    from      (select distinct color from one);  
    create table result as  
    select    id,  
              &color_list  
    from      one  
    group by  id;  
quit;



id            blue        green         orange            red  
1              0              2              1              2  
2              1              0              0              2  
3              0              1              0              1  

答案 3 :(得分:0)

对于(pteranodon),我碰巧正在审阅档案(6年以后),这就是为什么如此不合时宜,但有人可能会受益。

    proc sql noprint feedback;  
     select    catx(' ','sum(color =',quote(trim(color)),') as',color) into: color_list separated by ", "
       from (select distinct color from one);  
     create table result as  
      select id, &color_list  
      from one 
      group by id;  
    quit;