动态确定要在datastep SAS中搜索的列

动态确定要在datastep SAS中搜索的列,sas,sas-macro,datastep,Sas,Sas Macro,Datastep,我是SAS的新手,需要一些帮助来解决一个非常基本的问题 我有数百个单独的数据集,我想提取与某个诊断ID匹配的行 诊断ID列在DX1-DX11列中。但是,一些数据集只有DX1-DX4,而其他数据集在DX1-DX09中有诊断ID 因此,我需要一种方法来确定特定数据集中DX列的数量,以便我可以将感兴趣的诊断ID与数据集中所有适当列中显示的ID相匹配 例如,我想执行以下操作,但我无法跨所有数据集执行此操作,因为如果数据集没有列DX11(例如),则代码会中断,因为数据集中不存在DX11 DATA DX

我是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;

改为使用可变的快捷列表并重新构造代码<代码>DX:将引用以DX开头的所有变量

IF whichc('123', of dx:) or whichc('1234', of dx:)...
您需要使用IF而不是WHERE,因为WHERE不支持使用快捷方式


从长远来看,使用长格式而不是宽格式的数据更快更容易,而且诊断在诊断列表中的位置也无关紧要。

使用可变的快捷列表,并重新构造代码<代码>DX:将引用以DX开头的所有变量

IF whichc('123', of dx:) or whichc('1234', of dx:)...
您需要使用IF而不是WHERE,因为WHERE不支持使用快捷方式


从长远来看,使用长格式数据比使用宽格式数据更快、更容易,而且诊断在诊断列表中的位置也无关紧要。

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;

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;

感谢Reeza,你在5分钟内回答了一个很好的答案,而我却花了6个小时的搜索时间没有运气。感谢Reeza,你在5分钟内回答了一个很好的答案,而我花了6个小时的搜索时间没有运气。我写了一个宏,让你搜索整个库中的特定字符串,它在这里可用:我编写了一个宏,允许您在整个库中搜索特定字符串,它在这里可用: