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

Dynamically determine columns to search in datastep SAS

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

例如,我想执行以下操作,但我无法在所有数据集中执行此操作,因为如果数据集没有列 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 不支持使用快捷方式。

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

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

data dx_codes;
  set lib.&sas_file_n;
  array dx  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;