动态确定要在数据步骤SAS中搜索的列

问题描述 投票:0回答:2

我是SAS的新手,在一个非常基本的问题上需要一些帮助。

  • 我有数百个单独的数据集,我想提取与某个诊断ID匹配的行。
  • 诊断ID列在DX1-DX11列中。但是,有些数据集只有DX1-DX4,而其他数据集在DX1-DX09中有诊断ID。
  • 所以我需要一种方法来确定特定数据集中DX列的数量,这样我就可以将我感兴趣的诊断ID与所有相应列中数据集中显示的ID相匹配。

例如,我想要执行以下操作,但我无法在所有数据集中执行此操作,因为例如,如果数据集没有列DX11,则代码会中断,因为数据集中不存在DX11。

DATA DX_CODES (KEEP = ID DX1 DX2 DX3 DX4 DX5 DX6 DX7 DX8 DX9 DX10 DX11);
                                    SET LIB.&SAS_FILE_N;    
                                        WHERE DX1 IN ('123', '1234', '12345', '123456') OR
                                        DX2 IN ('123', '1234', '12345', '123456') OR
                                        DX3 IN ('123', '1234', '12345', '123456') OR 
                                        DX4 IN ('123', '1234', '12345', '123456') OR
                                        DX5 IN ('123', '1234', '12345', '123456') OR
                                        DX6 IN ('123', '1234', '12345', '123456') OR
                                        DX7 IN ('123', '1234', '12345', '123456') OR
                                        DX8 IN ('123', '1234', '12345', '123456') OR
                                        DX9 IN ('123', '1234', '12345', '123456') OR
                                        DX10 IN ('123', '1234', '12345', '123456') OR
                                        DX11 IN ('123', '1234', '12345', '123456');
                                    RUN;
sas sas-macro datastep
2个回答
1
投票

请改用快捷方式列表并重新构建代码。 DX:将引用从DX开始的所有变量。

IF whichc('123', of dx:) or whichc('1234', of dx:)...

您需要使用IF而不是WHERE,因为WHERE不支持使用快捷方式。

从长远来看,以更长的格式而不是宽格式处理数据更快更容易,因此诊断列表中的诊断位置也无关紧要。


1
投票

SAS很乐意为您创建新的变量。例如,如果您在数组中列出它们。只需使用子集IF而不是WHERE。在将数据加载到数据步骤之前,需要对数据进行操作。 IF对数据步骤中的数据进行操作,因此可以引用源数据集中未包含的变量。

data dx_codes;
  set lib.&sas_file_n;
  array dx $5 dx1-dx11;
  keep id dx1-dx11 ;
  if  dx1  in ('123', '1234', '12345', '123456') 
   or dx2  in ('123', '1234', '12345', '123456') 
   or dx3  in ('123', '1234', '12345', '123456') 
   or dx4  in ('123', '1234', '12345', '123456') 
   or dx5  in ('123', '1234', '12345', '123456') 
   or dx6  in ('123', '1234', '12345', '123456') 
   or dx7  in ('123', '1234', '12345', '123456') 
   or dx8  in ('123', '1234', '12345', '123456') 
   or dx9  in ('123', '1234', '12345', '123456') 
   or dx10 in ('123', '1234', '12345', '123456') 
   or dx11 in ('123', '1234', '12345', '123456')
  ;
run;
© www.soinside.com 2019 - 2024. All rights reserved.