2010-08-09 2 views
3

Вот мой вход:Эквивалент запроса кросс-таблицы доступа в SAS?

 
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 

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

ответ

3

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

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

Вы можете заполнить недостающие ячейки с нулями, используя SPARSE опцию TABLE заявления PROC FREQ «s. Таким образом, вам не нужен еще один шаг 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

Я никогда не был поклонником 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

Этот код имеет неверные котировки. Может кто-то исправить их, чтобы я мог понять эту технику? – pteranodon

+0

Просто отсутствует двойная кавычка открытия. Вот генерация кода с использованием CATX(), чтобы сделать части немного легче увидеть. 'select catx ('', 'sum (COLOR =', quote (trim (COLOR)), ') как', COLOR)', поэтому вы получаете код типа 'sum (COLOR =" blue ") как blue' – Tom

0

For (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;