Прежде чем мы начнем
- Когда вы называете свой флаг
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 решений сегодня, но я мог бы завтра.