SAS:按ID分组,并对ID变量中的条件数求和

时间:2018-07-27 13:59:36

标签: sas conditional-statements flags

我有一个数据集,其中包含ID和一个称为CC的变量。 CC包含多个编号的值,其中每个值表示某些内容。看起来像这样:

enter image description here

一个ID可以在多行中具有相同的CC,我只想标记CC是否存在,所以即使Joe有五行表明他的CC等于3我也只想用1或0来说明Joe CC等于3。

我希望它看起来像这样:

enter image description here

我尝试按如下所示对其进行编码,但问题是,尽管我知道一个ID可以具有多种类型的CC,但是从代码创建的最终数据集对于每个填充的ID仅显示1个CC。我认为可能是覆盖了吗? 另外我应该注意,在此代码之前,我创建了CC Flag变量并将其全部填充为零。

proc sql;
    DROP TABLE Flagged_CCs;
    CREATE TABLE Flagged_CCs AS
    select 
    ID,
    COUNT(ID) as count_ID,
    case when CC=1 then 1 end as CC_1,
    case when CC=2 then 1 end as CC_2,
    case when CC=3 then 1 end as CC_3 
  from Original_Dataset 
   group by ID;
quit;

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

您的问题是,在运行新代码后,每个ID仍然可以获得多行吗?

如果是这样,我建议这样做:

 proc sql;
      DROP TABLE Flagged_CCs;
      CREATE TABLE Flagged_CCs AS
      select ID
           ,case when CC_1 >0 then 1 else 0 end as CC_1
           ,case when CC_2 >0 then 1 else 0 end as CC_2
           ,case when CC_3 >0 then 1 else 0 end as CC_3
          from (
               select 
               ID,
               COUNT(ID) as count_ID,
               sum(case when CC=1 then 1 end) as CC_1,
               sum(case when CC=2 then 1 end) as CC_2,
               sum(case when CC=3 then 1 end) as CC_3 
               from Original_Dataset 
               group by ID 
           );
        quit;

出现问题的原因是,您只汇总ID的计数,而不汇总其他值,对它们使用汇总将消除重复的记录。

希望这会有所帮助

答案 1 :(得分:1)

如果您要查找报告,这是使用PROC TABULATE的一种方法。

proc format ;
value indicator_fmt
low - 0, . = 0
0 - high = 1;
run;

proc tabulate data=have;
class id cc;
table id , cc*N=''*f=indicator_fmt.;
run;

您的输出将如下所示:

enter image description here

如果您要在表中使用完全动态的方法,而无需事先知道任何信息,例如CC的数量,则这是另一种方法。它更长一些,但是动态部分使其可能值得实施。

enter image description here