我寻求你在SAS中创建下表的帮助。
我有这张桌子:
Policy no Policy type ID_Payor1 ID_Payor2 ID_Insured1 ID_Insured2 ID_Owner1 ID_Owner2
123 P1 A - B - A -
124 P2 B - - - - -
124 P1 A - C - C -
我想要创建的是这样的,它将合并每个ID所具有的多种策略类型:
ID Countflag_P1_Payor Countflag_P1_Owner Countflag_P1_Insured Countflag_P2_Payor Countflag_P2_Owner Countflag_P2_Insured
A 2 1 0 0 0 0
B 0 0 1 1 0 0
C 0 1 1 0 0 0
真的会得到你的帮助......
谢谢,
答案 0 :(得分:0)
我认为你想要一个proc freq或摘要来开始积累计数。创建A B C的格式并使用带有proc摘要的preloadfmt选项似乎是要走的路。
您想要创建格式并以此方式执行proc摘要的原因是您需要为每个policy_type生成一个具有A,B和C计数的数据集 - 即使这些组合不存在。就像样本数据中没有任何C for ID_payor1一样,但您仍然希望生成在该列中显示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数据集对每一列都有一个 freq 计数A B和C(并且缺少为 - )由每个变量和P1和P2组成。它不是你想要的,但现在已准备好转换。此数据集太大而无法在此处打印 - 它很长而不是宽,并且在列中有很多缺失值。但是在那时查看proc打印的结果,看看你得到了什么。
为了转置多列,我们需要在每列上运行一次proc转置,然后合并结果。宏似乎是走到这里的方式。
在转置之前,我也是对大数据集进行子集化,因此我们只有包含我们要转置的列的数据的行。
%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;
此时你应该有一个类似你正在寻找的桌子。