【问题标题】:SAS: Grouping by ID and summing the number of a condition in a variable for the IDSAS:按ID分组并将ID变量中的条件数相加
【发布时间】:2018-07-27 13:59:36
【问题描述】:

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

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

我希望它看起来像这样:

我尝试按如下所示对其进行编码,但问题是虽然我知道一个 ID 可以有不止一种类型的 CC,但从代码创建的最终数据集仅显示每个填充的 ID 1 个 CC。我想也许它正在覆盖它? 另外我应该注意,在此代码之前,我创建了 CC 标志变量并将其全部填充为零。

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;

感谢您的帮助,谢谢。

【问题讨论】:

  • 当您将数据作为图像发布时,我必须将其输入。
  • 谢谢,我原来是打出来的,但是间距全没了,很难看到列。如何轻松查看列并使其间距正确?我应该使用代码高亮按钮吗?

标签: sas conditional-statements flags


【解决方案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,否则使用 0。我也看到了 Reeza 的答案,我认为可以使用该方法,而无需先为每个变量创建标志,然后把它全部打出来,所以我下次会用它。但是我使用了这种方法,因为我已经准备好了所有代码,只需要包含总和。
【解决方案2】:

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

您的输出将如下所示:

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

【讨论】:

  • 感谢您的帮助!!下次我将使用您的方法,但这次我使用了wired604的方法,因为它只是我必须包含的一个总和,这是一个简单的更改。但是,您的方法更好,因为我不必创建每个变量。
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2021-05-23
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多