数据集为:
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 REPORT,但它没有为TC=3创建表。我认为可以使用PROC SQL。请帮帮我。我更喜欢PROC SQL, PROC REPORT,因为它们的输出可以在后面的步骤中轻松使用。
不推荐:PROC TABULATE, PROC FREQ
您可以使用格式和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;
我也在SAS社区上发布了这个问题。我从那里抄了一些最热门的答案。
使用PROC REPORT:
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;
感谢:Paige Miller (SAS Community)
使用PROC table:
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 Community)
来自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 Community)