基于指定规则的数据集指示变量
假设有如下数据集:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
