Помислете, че имам два набора данни:
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;
Търся по-ефективен начин -
edit: за по-голяма яснота, има ли начин да се върне броят на съвпаденията в два масива от данни, без 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;