Динамическое определение столбцов для поиска в DataStep SAS

Я новичок в SAS, и мне нужна помощь с очень простой проблемой.

  • У меня есть сотни отдельных наборов данных, и я хочу извлечь строки, соответствующие определенному диагностическому идентификатору.
  • Диагностические идентификаторы перечислены в столбцах DX1-DX11. Однако некоторые наборы данных имеют только DX1-DX4, а другие имеют диагностические идентификаторы в пределах DX1-DX09.
  • Поэтому мне нужен способ определить количество столбцов DX в конкретном наборе данных, чтобы я мог сопоставить интересующие меня диагностические идентификаторы с идентификаторами, представленными в наборе данных во всех соответствующих столбцах.

Например, я хотел сделать следующее, но я не могу сделать это для всех наборов данных, потому что, например, если в наборе данных нет столбца 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;

person Tim    schedule 30.04.2019    source источник
comment
Я написал макрос, который позволяет искать определенную строку во всей библиотеке. Он доступен здесь: github.com/Boemska/macrocore/blob/master/base/mp_searchdata.sas   -  person Allan Bowe    schedule 30.04.2019


Ответы (2)


Вместо этого используйте переменные короткие списки и реструктурируйте свой код. DX: будет относиться ко всем переменным, начинающимся с DX.

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

Вам нужно использовать IF вместо WHERE, потому что WHERE не поддерживает использование сокращений.

В долгосрочной перспективе быстрее и проще работать с вашими данными в длинном формате, а не в широком формате, тогда также не имеет значения, где находится диагноз в списке диагнозов.

person Reeza    schedule 30.04.2019
comment
Спасибо, Риза, вы ответили через 5 минут с отличным ответом, в то время как мне потребовалось 6 часов безуспешных поисков. - person Tim; 30.04.2019

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;
person Tom    schedule 30.04.2019