Arrays SAS阵列到Proc SQL

Arrays SAS阵列到Proc SQL,arrays,sas,proc-sql,Arrays,Sas,Proc Sql,在一个非常大的保险索赔数据集中,如果任何诊断代码ICD1到ICD25是'79571'或'R75',我必须将观察结果标记为hiv\u屏幕,其他标记也是如此 我写的数据步骤如下: data inpatient_claims_2018 (keep=ID, ICD1-ICD25, hiv_screen, ...); set cl2018.ip_claims; array diag[25] ICD1-ICD25; do i to 25; if diag(i) in: ('

在一个非常大的保险索赔数据集中,如果任何诊断代码
ICD1
ICD25
'79571'
'R75'
,我必须将观察结果标记为
hiv\u屏幕
,其他标记也是如此

我写的数据步骤如下:

data inpatient_claims_2018 (keep=ID, ICD1-ICD25, hiv_screen, ...);
   set cl2018.ip_claims;

   array diag[25] ICD1-ICD25;
   do i to 25;
       if diag(i) in: ('79571', 'R75') then hiv_screen=1;
       if diag(i) in: ......
   end;

   *retain those that were flagged;
   if hiv_screen=1 or ...=1;
run;
需要很长时间,我希望使用
proc-SQL
会更快。 如何最好地将SAS数组转换为SQL语句

在我们开始之前
  • 当你把你的标志称为hiv\u屏幕时,我假设你实际上只需要你将标志的观察结果。如果是这样,您最好选择它们,而不是标记它们
  • 如果只使用一次结果,最好创建一个视图而不是一个表。这样可以避免大量的磁盘访问
  • 数据步骤中的所有逻辑都是在构建变量向量之后应用的,除了where语句中的逻辑,我假设SQL查询中的where子句也是如此。因此,在where语句/子句中选择数据比标记数据更快
  • 数据步骤本质上并不比SQL查询慢。如果是,你就不能很好地使用它们。例如,使用keep语句,您可以选择所需的变量,并且不再将其他变量写入磁盘
宏作为阵列的替代方案

宏与C++中的预编译代码非常类似。它向程序中添加语句

%macro any_ICD_in (string_list, ICD_count);
    ICD1 in (&string_list)
    %do icd_nr = 2 %to &ICD_count;
        or ICD%icd_nr in (&string_list)
    %end;
%mend;

%* test the macro;
%put %any_ICD_in('79571', 'R75');
使用宏 在数据步骤中 仅通过读取相关数据来提高性能 在数据步骤中
今天我不会花时间添加SQL解决方案,但明天可能会添加。

为什么您认为更改为SQL会对速度产生任何影响?您的意思是将数据移动到某个大型外部数据库中,该数据库的处理速度比SAS服务器快吗?有多大?您使用的
LIBNAME CL2018
语句是什么?您正在连接到哪个数据库?它是本地网络还是本地/远程网络数据库?您使用的是什么引擎?为什么标记记录而不选择它们?您希望标记的百分比是多少?您需要数据集中的大多数字段,还是只需要一些字段?我正在分析医疗保险索赔,所以有数百万索赔。我不确定是否准确,因为有太多的文件需要合并。是的,我在数据集中选择了所需的变量,并保留了我标记的观察值(感谢捕捉到这些,我将对其进行编辑)。对于在SAS数据步骤上使用Proc SQL,我了解到,Proc SQL支持显式传递到数据库,并且数据步骤按顺序读取每个观察值,因此,在处理大型日期集时,Proc SQL可能是一个优势。在宏调用中,是否缺少任何ICD前的%符号?我是。谢谢。谢谢你提供的信息!对不起,我最初的问题模棱两可。我之所以将其标记为1,是因为我必须按ID将它们相加,以查看它们是否符合疾病病例定义。例如,艾滋病毒阳性病例将是至少一次艾滋病毒筛查和至少两次艾滋病毒诊断。
data inpatient_claims_2018;
   set cl2018.ip_claims;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...
run;
data inpatient_claims_2018;
   set cl2018.ip_claims;

   where %any_ICD_in('79571', 'R75')
      or %any_ICD_in('I', 'dont', 'know')
      or ...
      ;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...

   keep hiv_screen covid19_screen ... <and all other variable you really need>;
run;
data inpatient_claims_2018 / view=inpatient_claims_2018;
   set cl2018.ip_claims;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...
run;