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

SAS: Grouping by ID and summing the number of a condition in a variable for the ID

我有一个数据集,其中包含 ID 和一个名为 CC 的变量。 CC 包含多个编号值,其中每个值代表某物。它看起来像这样:

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

我希望它看起来像这样:

我尝试按如下所示对其进行编码,但问题是,尽管我知道一个 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;

感谢任何帮助,谢谢。

您的问题是在 运行 您的新代码之后每个 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 的计数而不是其他值,对它们使用聚合将消除重复记录。

希望对您有所帮助

如果您要查找报告,这里有一种方法,使用 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;

您的输出将如下所示:

如果您想在 table 中使用完全动态的方法,您不需要提前知道任何信息,例如 CC 的数量,这是一种不同的方法。它有点长,但动态部分使其可能值得实施。