Перекрестная таблица — Таблица частот в SAS

#sql #sql-server #sas #sas-macro #proc

Вопрос:

Набор данных является:

 data sample;
input FY TC;
datalines;
2013 1
2014 5
2013 6
2015 7
2016 1
2015 5
2016 2
2014 2
2013 7
2014 4
2017 5
2018 1
2018 6
2015 4
2014 2
2015 4
;
 

Желаемый результат:

     FY  tc1 tc2 tc3 tc4 tc5 tc6 tc7
2013    1   0   0   0   0   1   1
2014    0   2   0   1   1   0   0
2015    0   0   0   2   1   0   1
2016    1   1   0   0   0   0   0
2017    0   0   0   0   1   0   0
2018    1   0   0   0   0   1   0
 

Важным моментом в приведенном выше выводе является то, что для TC=3 нет точки данных, но я хочу, чтобы она была в моем выходном наборе данных, который мне понадобится позже для расчета на другом шаге. Опять же, эта недоступность данных TC=3 предназначена только для описания и для одной конкретной категории (например, коммерческая недвижимость). Для других категорий у меня могут отсутствовать точки данных для TC=4 (например, для жилой недвижимости) или так далее. Поэтому мне нужна перекрестная таблица, в которой я могу иметь столбцы частот для каждого из TC=1 до TC=7, независимо от того, доступна ли какая-либо точка данных для TC=1 до TC=7 или нет.

Я хорошо осведомлен о ОТЧЕТЕ PROC, но он не создает таблицы для TC=3. Я думаю, что это можно сделать с помощью PROC SQL. Пожалуйста, помогите мне здесь. Я предпочитаю PROC SQL, ОТЧЕТ PROC, так как их вывод можно легко использовать на более позднем этапе.

Не предпочтительно: PROC TABULATE, PROC FREQ

Комментарии:

1. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или в другом месте) и почему это не соответствует вашим потребностям.

2. Странное ограничение, когда proc tabulate и freq справляются с этим довольно хорошо, используя предварительную загрузку или разреженную опцию.

3. @Reeza они не используют те значения, которых нет в наборе данных. В моем наборе данных ни у одного Fy нет tc=3, но мне это нужно в моих выходных данных

4. @ДалеК, я удалил изображения

5. @VaibhavKabdwal да, они очень многое могут с помощью РАЗРЕЖЕННЫХ или предварительно ЗАГРУЖЕННЫХ опций.

Ответ №1:

Вы можете использовать формат и preloadfmt с completerows или completecols , чтобы получить то, что вы ищете. Ниже приведена простая версия этого, вам, вероятно, понадобится completecols across переменная для вашей — можете предоставить ее, если вы предоставите фактический код для создания своей таблицы.

 proc format;
 value age
 9="Nine"
 10="Ten"
 11="Eleven"
 12="Twelve"
 13="Thirteen"
 14="Fourteen"
 15="Fifteen"
 16="Sixteen"
 17="Seventeen"
 ;;;;
run;
 
proc report data=sashelp.class completerows;
column age age=count;
format age age.;
define age/preloadfmt group order=internal;
define count/computed n;
run;
 

Ответ №2:

Я также разместил этот вопрос в сообществе SAS. Я копирую оттуда некоторые лучшие ответы.

Получение желаемого с помощью ОТЧЕТА PROC:

 data intermediate;
    set sample end=eof;
    weight=1;
    output;
    if eof then do;
        tc=3;
        weight=0;
        output;
    end;
run;
options missing=0;
proc report data=intermediate;
    columns fy tc,weight;
    define fy/group;
    define tc/across;
    define weight/sum ' ';
    rbreak after/summarize;
run;
 

Кредиты: Пейдж Миллер (сообщество SAS)

Получение желаемого с помощью таблицы PROC:

 proc format;
    value yrfmt
    2013=2013
    2014=2014
    2015=2015
    2016=2016
    2017=2017
    ;
    
    value tcfmt
    1=1
    2=2
    3=3
    4=4
    5=5
    6=6
    7=7
    ;
run;

proc tabulate data=sample out=counts;
    class FY tc / preloadfmt;
    format tc tcfmt. fy yrfmt.;
    table FY*tc / printmiss;
run;

proc sort data=counts;
    by fy;
run;

proc transpose data=counts out=counts_t (drop=_name_) prefix=tc;
    by fy;
    var N;
    id tc;
run;
 

Кредиты: Irackley (сообщество SAS)

Ответ №3:

Лучший ответ от сообщества SAS:

 proc sql;
    select FY, 
    sum(TC=1) as tc1,
    sum(TC=2) as tc2,
    sum(TC=3) as tc3,
    sum(TC=4) as tc4,
    sum(TC=5) as tc5,
    sum(TC=6) as tc6,
    sum(TC=7) as tc7
        from sample
        group by FY;
quit;
 

Кредиты: Irackley (сообщество SAS)