您好:
我有一份患者索赔数据集,并希望创建一组新的患者声称,这些患者声称有酒精使用。我已经将这些酒精诊断代码放在一个新的数据集中,并尝试针对更大的患者声明运行它来创建新的数据集。
以下是我一直在尝试的代码:
data alcohol;
input code;
datalines;
30300
30301
30302
30303
30390
30391
30392
30393
30501
30500
30502
30503
;
data alcohol;
set alcohol;
code1 = put(code, 5.);
output;
run;
/*inpatient records with these codes*/
proc sql;
create table alcin as
select b.*
from allpreg as b
where
diag1 in (select code1 from alcohol) or
diag2 in (select code1 from alcohol) or
diag3 in (select code1 from alcohol) or
diag4 in (select code1 from alcohol) or
diag5 in (select code1 from alcohol) or
diag6 in (select code1 from alcohol) or
diag7 in (select code1 from alcohol) or
diag8 in (select code1 from alcohol) or
diag9 in (select code1 from alcohol);
quit;
有更好的方法可以做到这一点,还是这样做? 谢谢!
答案 0 :(得分:2)
您的数据的一个问题是结构:有9个不同的诊断代码,因为变量很难处理,因为您必须将比较写出9次,如果您要添加第10个诊断代码列,则再次更改所有代码。更好的结构每次诊断会有一行。 PROC TRANSPOSE可以帮助您,或数据步骤; linked question就是一个很好的例子。如果您需要输出数据集中的所有九个代码,您仍然可以执行此操作(然后将结果表合并/连接到原始表以获取限定行),或者您可能不希望更改结构。
但是,无论您的结构如何,您都有一个单独的问题;如何最好地组合两个表。毕竟,这就是你在做什么。你的方法是一种可接受的方法,特别是当列表相对较短时;因为子查询不会花费很长时间来运行只有少数酒精代码,所以它并不是一个糟糕的解决方案。
在这种情况下,更好的解决方案是format
。您可以将酒精代码列表转换为一种格式,然后可以与put
一起使用来评估行是否符合条件。 (为简洁起见,我在下面包含了一部分代码,您可以编写完整的列表。)
proc format;
value $alcoholdrg
'30300','30301','30302','30303'= 'Alcohol'
other='Not Alcohol';
quit;
然后你可以轻松使用它:
proc sql;
create table alcin as
select b.*
from allpreg as b
where put(diag1,$ALCOHOLDRG.) = 'Alcohol';
quit;
(同样,为简洁起见,我包含一个诊断,您需要全部九个或重组您的数据才能使其正常工作。)
鉴于您正在使用ICD代码,我会在网上浏览与其合作的代码或文章;有一些复杂性与子代码如何工作有关,这可能会使这更复杂,毫无疑问,如何处理在更专业的网站上可用的这类问题的建议。