基于指定规则的数据集指示变量

编程语言 2026-07-11

假设有如下数据集:

data mydataset;
infile datalines;
input ID $ Relation $ Type $ G5 $;
datalines;
001 Related           A    Y 
001 PossiblyRelated   B    Y
001 NotRelatd         A    N
001 Related           C    N
002 Related           A    Y
003 NotRelated        C    Y
004   .               B    Y
004 Related           B    N

;
run;

我需要对ID进行标记(用Y,N),若其至少有一种类型(疾病)属于Related、PossiblyRelated中的任意一个,不论是哪一种类型。接着,我还要对每个ID标记其至少有一个G5 = "Y" 的情况,同时不考虑 "Relation" 变量的取值。为每个ID做这两步标记。

期望的输出为:

data desired;
infile datalines;
input ID $ Relation $ Type $ G5 $ Flag1 $ Flag2 $;
datalines;
001 Related           A    N  Y  N
001 PossiblyRelated   B    Y  N  Y
001 NotRelatd         A    N  N  N
001 Related           C    Y  N  N
002 Related           A    Y  Y  Y 
003 NotRelated        C    Y  N  Y
004   .               B    Y  .  Y
004 Related           B    N  Y  N

;
run;

这只是一个示例,但在实际情况中,同一数据集中需要标记的变量还有很多。

我尝试使用proc sql:

proc sql;
    create table mytable as
    select *,
           case when Relation in ("Related","PossiblyRelated") then "Y" else "N" end as Flag1
    from mydataset
    group by ID;
quit;

但这不幸地在条件成立时总是标记所有观测,并且只涉及一个变量。

如何指定类似first.ID的方式,使在条件满足时仅标记一次?另外,如何在对多个变量应用不同规则的同时仍然保持first.ID只计一次?

这源自编程需求:对ID标记“至少有一个”等情况。

先行致谢。

解决方案

要仅标记其中一条观测,您需要再创建至少一个变量来指示是否存在任何先前观测已被标记。

下面给出一种方法。请注意,我发现用数值布尔标志而不是你要求的字符标志要容易得多。

这是使用数组来实现的设置,方便你看到如何把它从2 个变量扩展到10个变量。

基本上,一个数组(IS)表示当前观测是否是待标记的候选项。接着有一个数组(ANY)表示是否有任何观测被标记。最后,FIRST数组是应该拥有你想要的标志的那个。

data want;
   set have;
   by id;
   array is  is_related is_g5 ;
   array any any_related any_g5;
   array first first_related first_g5;
   retain any_: first_: ;
   if first.id then call missing(of any_: first_:);
   is_related = relation in ('Related', 'PossiblyRelated') ;
   is_g5 = g5 in ('Y');
   do over any ;
     first = is and not any ;
     any = any or is ;
   end;
run;

结果

在此处输入图片描述

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章