Динамически определять столбцы для поиска в шаге данных SAS - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в 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;

Ответы [ 2 ]

1 голос
/ 30 апреля 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;
1 голос
/ 30 апреля 2019

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

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

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

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

...