#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)