我认为您希望在这里开始使用 proc freq 或摘要来累积计数。为 ABC 创建格式并使用带有 proc 摘要的 preloadfmt 选项似乎是要走的路。
您想要创建格式并以这种方式进行 proc 汇总的原因是因为您需要生成一个数据集,该数据集包含每个 policy_type 的 A、B 和 C 计数——即使组合不存在。就像您的示例数据中 ID_payor1 没有任何 C 一样,但您仍然希望生成在该列中显示 C 计数为 0 的行。
data table1;
input Policy_no
Policy_type $ ID_Payor1 $ ID_Payor2 $
ID_Insured1 $ ID_Insured2 $ ID_Owner1 $ ID_Owner2 $;
datalines;
123 P1 A . B . A .
124 P2 B . . . . .
124 P1 A . C . C .
;
proc format;
value $abc
'A'='A'
'B'='B'
'C'='C'
'.'='-'
;
run;
proc summary data=table1 completetypes nway;
class ID_Payor1 ID_Payor2
ID_Insured1 ID_Insured2 ID_Owner1
ID_Owner2 /preloadfmt missing;
class policy_type;
types policy_type * (ID_Payor1 ID_Payor2 ID_Insured1
ID_Insured2 ID_Owner1 ID_Owner2);
output out=sumt1;
format ID_Payor1 ID_Payor2 ID_Insured1 ID_Insured2 ID_Owner1 ID_Owner2 $abc.;
run;
proc print data=sumt1;
此时,您的 sumt1 数据集的每一列都有 AB 和 C 的频率计数(并且缺少 -),每个变量和 P1 和 P2。它还不是您想要的,但现在可以转置了。该数据集太大,无法在此处打印——它长而不是宽,并且列中有很多缺失值。但是请查看 proc print 的结果,看看你得到了什么。
对于转置多列,我们需要在每一列上运行一次 proc transpose,然后合并结果。宏似乎是去这里的方式。
在转置之前,我还对大型数据集进行了子集化,因此我们只有包含要转置的列的数据的行。
%global freqtables;
%MACRO transall(mCol);
data tmp_col;
set sumt1;
if &mCol. in ('A','B','C');
proc transpose data=tmp_col
out=outTrans_&mCol.(rename= &mCol.=IDabc) prefix=&mCol._;
by &mCol.;
id policy_type;
var _FREQ_;
run;
%let freqtables = &freqtables outTrans_&mCol.(drop= _NAME_);
%* using freqtables macro variable to autogenerate a list;
%* of tables for merging later;
%MEND transall;
%transall(ID_Payor1);
%transall(ID_Payor2);
%transall(ID_Insured1);
%transall(ID_Insured2);
%transall(ID_Owner1);
%transall(ID_Owner2);
*创建另一个宏以循环变量的奖励积分;*而不是上面的——特别是如果你有更多的列;
data combined_counts;
merge &freqtables;
by IDabc;
run;
proc print data=combined_counts;
在这一点上,你应该有一张你正在寻找的桌子。