Розглянемо, я маю два набори даних:
data dataset_1;
input CASENO X;
datalines;
1 100
2 200
3 300
;
data dataset_2;
input CASENO Y;
datalines;
2 200000
3 300000
;
Я хочу знайти, скільки CASENO з'являються в обох списках: у прикладі вище я б отримав 2.
Мої дані дуже великі. Використання злиття триває багато часу, щоб отримати такий результат.
data result;
merge dataset_1 (in = a) and dataset_2 (in = b);
by CASENO;
if a and b;
RUN;
Я шукаю більш ефективний спосіб -
змінити: для ясності, чи є спосіб повернути кількість матчів у два набори даних, без якого SAS має виписати отриманий файл?
Відповіді:
2 для відповіді № 1Якщо набори даних вже відсортовані, з'єднання даних стає неймовірно ефективним. Він пропускає по кожному рядку в кожній таблиці рівно один раз. Звичайно, якщо ви просто хочете рахувати, вам не потрібно виводити всі рядки в набір даних, ви можете просто:
data _null_;
merge dataset_1 (in = a keep=caseno) dataset_2 (in = b keep=caseno) end=eof;
by CASENO;
if a and b then count+1;
if eof then call symputx("count",count);
RUN;
Це буде набагато швидше запустити, оскільки ви не такписати що-небудь. Я також додаю твердження KEEP (як зазначає Том у коментарях) до вхідних наборів даних, які слід читати лише за змінною, це призводить до прискорення приблизно на 10%.
Якщо є набори даних індексований, у вас є деякі додаткові параметри, які будуть швидшими, оскільки вони будуть виконувати сканування індексу (наприклад, використання SQL). Але у сортованих, неіндексованих таблицях важко покращити об'єднання даних етапу.
1 для відповіді № 2
Спробуйте:
proc sql;
select count(caseno) as Number from dataset_1 where caseno in (select caseno from dataset_2);
quit;