SAS Array для Pro c SQL - PullRequest
       71

SAS Array для Pro c SQL

0 голосов
/ 20 апреля 2020

В очень большом наборе данных страховых претензий я должен пометить наблюдения как hiv_screen, если любой из диагнозов c кодов ICD1 до ICD25 равен либо '79571', либо 'R75', а также для других флаги.

шаги с данными, которые я написал:

data inpatient_claims_2018 (keep=ID, ICD1-ICD25, hiv_screen, ...);
   set cl2018.ip_claims;

   array diag[25] ICD1-ICD25;
   do i to 25;
       if diag(i) in: ('79571', 'R75') then hiv_screen=1;
       if diag(i) in: ......
   end;

   *retain those that were flagged;
   if hiv_screen=1 or ...=1;
run;

занимает много времени, и я надеюсь, что использование proc SQL будет быстрее. Как мне лучше всего преобразовать массив SAS в оператор SQL?

1 Ответ

1 голос
/ 20 апреля 2020

Прежде чем мы начнем

  • Когда вы называете свой флаг hiv_screen, я предполагаю, что вам действительно нужны только те наблюдения, которые вы отметите. Если это так, лучше выбрать их, а не отмечать их.
  • Если вы будете использовать результаты только один раз, лучше создать представление, чем таблицу. Таким образом вы избегаете большого доступа к диску.
  • Все логики c в шаге данных применяются после построения вектора переменных, за исключением того, что в операторе where и я предполагаю, что то же самое верно для предложения where в запросе SQL. Следовательно, быстрее выбрать данные в операторе / предложении where, чем пометить их.
  • Шаги данных не являются по сути медленнее, чем запросы SQL. Если они есть, вы не используете их хорошо. Например, с помощью оператора keep вы выбираете, какую переменную вы хотите, и больше не записываете другие на диск.

Макросы как альтернатива для массивов

Макрос очень сопоставим к прекомпилятору кода, например, C ++. Он добавляет операторы в вашу программу.

%macro any_ICD_in (string_list, ICD_count);
    ICD1 in (&string_list)
    %do icd_nr = 2 %to &ICD_count;
        or ICD%icd_nr in (&string_list)
    %end;
%mend;

%* test the macro;
%put %any_ICD_in('79571', 'R75');

Использование макроса

на шаге данных

data inpatient_claims_2018;
   set cl2018.ip_claims;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...
run;

Повышение производительности за счет чтения только соответствующих данных

в шаге данных

data inpatient_claims_2018;
   set cl2018.ip_claims;

   where %any_ICD_in('79571', 'R75')
      or %any_ICD_in('I', 'dont', 'know')
      or ...
      ;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...

   keep hiv_screen covid19_screen ... <and all other variable you really need>;
run;

В качестве альтернативы вообще не следует записывать данные на диск

в шаге данных

data inpatient_claims_2018 / view=inpatient_claims_2018;
   set cl2018.ip_claims;

   hiv_screen = %any_ICD_in('79571', 'R75');
   covid19_screen = %any_ICD_in('I', 'dont', 'know');
   ...
run;

Я не буду тратить время на добавление SQL решений сегодня, но я мог бы завтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...