/ / SAS - кількість записів, які з'являються в обох наборах даних (великі дані) - sas

SAS - кількість записів, які з'являються в обох наборах даних (великі дані) - sas

Розглянемо, я маю два набори даних:

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;