#sas
#sas
Вопрос:
У меня есть исходная таблица с ~ 40 000 000 уникальных / отдельных записей и новая таблица с ~ 80 000 000 уникальных / отдельных записей, по одному столбцу в каждой.
Мне нужно создать столбец флага в новой таблице, который отображает 1, если уникальная запись соответствующего наблюдения также присутствует (имеет совпадения) в исходной таблице, и 0, если она не имеет совпадений.
Как мне сделать это наиболее эффективно?
Является ли использование proc sql неизбежным, или это можно решить только с помощью SAS?
Ответ №1:
Чтобы добавить новую переменную в набор данных, вам нужно создать новый набор данных. Предполагая, что данные уже отсортированы по ключевой переменной, просто выполните СЛИЯНИЕ. Вы можете использовать опцию IN= dataset, чтобы проверить, какие наборы данных вносят наблюдения в слияние.
data want ;
merge new(in=innew) old(in=inold);
by key_var;
if innew;
new_var = inold;
run;
Ответ №2:
Вот мое решение для вашей справки:
/*step1: create a new dataset containing unique values of your new table*/
data new1;
set you_new_table(keep=var1 var2 var3...varx);
proc sort nodup;
by var1 var2 var3...varx;
run;
/*step2: create a new dataset containing unique values of your old table*/
data old1;
set you_old_table(keep=var1 var2 var3...varx);
proc sort nodup;
by var1 var2 var3...varx;
run;
/*step3: merge the two table that just created (inner join)*/
data compare1;
merge old1(in=a) new1(in=b);
by var1 var2 var3...varx;
if a and b;
proc sort;
by var1 var2 var3...varx;
run;
/*step4: merge the inner join dataset with the new source table and generate the flag*/
data new2;
set you_new_table;
proc sort;
by var1 var2 var3...varx;
run;
data new3;
/*merge new2(in=a) new1(in=b); sry, a mistake, shame.*/
merge new2(in=a) compare1(in=b);
by var1 var2 var3...varx;
if a;
if b then flag=1;
else flag=0;
run;
Комментарии:
1. спасибо, это сработало для фиктивного набора данных, который я создал со значениями 50 и 100. Я думаю, что в строке после «data new3;» должно быть «compare1» вместо «new1». Предвидите ли вы какие-либо проблемы с большими наборами данных?
2. кроме того, какова цель создания new2?
3. @Rohit 1) строка после «data new3;» — моя ошибка. Я исправил, спасибо за указание 4.
4. @Rohit 2) dataset new2 — это отсортированная версия вашей новой исходной таблицы. Оператор merge требует, чтобы весь набор данных был отсортирован по одному и тому же ключу vars.