Как сравнить 2 таблицы для сопоставления значений столбца в SAS?

#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.