使用转置的SAS多个标志

时间:2013-07-30 04:35:44

标签: sas

我寻求你在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   

真的会得到你的帮助......

谢谢,

1 个答案:

答案 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; 

此时你应该有一个类似你正在寻找的桌子。