我正在使用SAS数据集,该数据集包括针对单个患者开出的多达30种药物。药物编码为med1,med2 ... med30。每种药物均由5位数字的字符变量表示。然后,使用标识符,我可以编码药物的名称,以及该特定药物是局部抗生素还是全身性抗生素。
对于每位患者,我想使用所有30种药物代码创建一个变量,指示该患者是仅使用局部抗生素,仅使用全身抗生素还是同时使用局部和口服抗生素。因此,如果30种药物中的任何一种是全身性抗生素,我都希望患者编码为oral_antibiotic = 1。
我目前有以下代码: 数据不足; 设置有 数组meds [30] med1-med30; 如果('06925''06920')中的meds [i],则执行; 青霉素= 1; 口服抗生素= 1; 结束; 否则,如果('03197')中的meds [i]执行; 新孢子素= 1; topical_antibiotic = 1; 结束; ....(更多药物会循环使用更多药物) 运行;
问题在于此代码创建的是一个指标变量而不是30,从而覆盖了先前的信息。
我认为我真的需要30个指标变量,指示这30种药物中的每一种是口服抗生素还是局部抗生素,在我写代码说如果任何一种药物是口服抗生素之前,患者都接受了口服抗生素。
我是宏的新手,非常感谢您的帮助。
data current;
input med1 med2 med3;
cards;
'06925' '06920' '03197' ;
run;
我想要这个:
data want;
input med1 topical_antibiotic1 oral_antibiotic1 med2 topical_antibiotic2 oral_antibiotic2 med3 topical_antibiotic3 oral_antibiotic3;
cards;
'06925' 0 1 '06920' 0 1 '03197' 1 0
;
run;
答案 0 :(得分:0)
我认为我确实需要30个指标变量,用于指示是否 在我撰写之前,这30种药物中的每一种都是口服或局部抗生素 编码说如果任何一种药物是口服抗生素,则患者 接受了口服抗生素。
那不是事实。只要不重置它们,您当前的方法就可以。您没有向我们展示完整的代码,因此很难说,但是我将假设这就是这里发生的事情。
您的循环应如下所示:
array med(30) med1-med30;
*set to 0 at top of the loop;
topical_antibiotic=0; oral_antibiotic=0;
do i=1 to dim(med);
if med(i) in (.....) /*list of topical codes*/ then topical_antibiotic=1;
else if med(i) in (.....) /*list of oral codes*/ then oral_antibiotic=1;
end;
这假定抗生素不能同时在局部/口服组中使用。如果可以,则需要从第二个IF语句中删除ELSE。
答案 1 :(得分:0)
我同意您可能每个药物组仅需要一个指标变量(感兴趣的药物)。好像您只是想为每个主题都知道,“他们有吗?”本示例翻转IN运算符的参数。如果您提供了更多示例数据,则本示例可以做得更好。
data current;
infile cards missover;
array med[3] $5;
input med[*];
oral_antibotic = '069' in: med; /*Assume oral all start with '069'*/;
topical_antibotic = '03197' in med;
cards;
06925 06920 03197
06925
;;;;
run;