1

在 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   

真的很感激你的帮助..

谢谢,

4

1 回答 1

0

我认为您希望在这里开始使用 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; 

在这一点上,你应该有一张你正在寻找的桌子。

于 2013-07-31T06:47:01.770 回答