Эквивалент Access Crosstab Query в SAS? - PullRequest
5 голосов
/ 09 августа 2010

Вот мой ввод:

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

Вот что я хочу получить в своем выводе - количество записей по идентификатору для каждого цвета:

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

Я знаю, что могу получитьинформация использует proc freq, но я хочу вывести набор данных в точности как тот, который я написал выше.Кажется, я не могу понять, как сделать цвета столбцами в этом выходном наборе данных.

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

сначала сгенерируйте данные.

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;

далее, суммировать количество цветов по идентификатору.

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;
2 голосов
/ 09 сентября 2010

Вы можете заполнить недостающие ячейки нулями, используя опцию SPARSE для оператора PROC FREQ s TABLE.Таким образом, вам не нужен еще один DATA шаг.Порядок цветов также можно контролировать с помощью опции ORDER= до PROC FREQ.

data one;
  input id color :$8.;
datalines;
1   green
1   red
1   orange
1   green
1   red
2   red
2   red
2   blue
3   green
3   red
run;
proc freq data=one noprint order=data;
  table id*color /out=freq sparse;
run;
proc transpose data=freq out=two(drop=_:);
    id color;
    by id;
    var count;
run;
proc print data=two noobs;
run;
/* on lst
id    green    red    orange    blue
 1      2       2        1        0
 2      0       2        0        1
 3      1       1        0        0
*/
1 голос
/ 27 сентября 2010

Я никогда не был поклонником proc transpose, потому что никогда не помню синтаксис. Вот способ сделать это с помощью 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  
0 голосов
/ 17 декабря 2016

Для (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;
...