/ / 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;

Търся по-ефективен начин -

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;