SAS сопоставляет два набора данных по идентификатору и создает индикатор - PullRequest
0 голосов
/ 06 августа 2020

У меня есть эти два набора данных с другим кодом элемента

Data1

ID    Item_Code
101      672
101      672
201      672


Data2

ID    Item_Code
101      075
101      075
401      075

Мне нужно создать следующий набор данных

Want

ID    Item_Code    Data1_only  Data2_only Both_Data1_Data2
101      672                                    1
101      672                                    1 
101      075                                    1 
101      075                                    1 
201      672           1
401      075                         1


 Data1_only = Id exists in Data1 only
 Data2_only = Id exists in Data2 only 
 Both_Data1_Data2 = ID Exists in both the datasets

Я использую следующие code

Data final;
set Data1 (in=a) and Data2 (in=b);
By id;
  if a and not b then Data1_only=1;
  if b and not a then Data2_only=1;
  if a and b then Both_Data1_Data2=1;
 run;

Но это не решает цель. У меня миллионы записей в наборе данных, и любая помощь здесь очень ценится.

Спасибо

1 Ответ

0 голосов
/ 06 августа 2020

Стандартный SET оператор, единственный в неявных наборах данных l oop DATA step stacks. Вы не сможете понять второй набор при чтении (и выводе) данных из первого набора данных.

Однако DOW l oop с SET и BY может перебирать оба набора данных и вычислять желаемые флаги состояния для группы BY. После того, как группа прочитана, флаги состояния используются для вычисления окончательных желаемых логических переменных. A секунда DOW применяет вычисленный результат к каждой строке в группе с двумя источниками .

Пример:

  • Неявный сброс переменных к отсутствующему в верхней части неявного l oop.
  • Flag1 и Flag2 назначаются условно, когда in= переменная принимает истинное значение
  • Flag1 и Flag2 вычисляют общую переменную состояния группы после группа обработки в первом л oop
data Data1; input
ID    Item_Code; datalines;
101      672
101      672
201      672
;

data Data2; input
ID    Item_Code; datalines;
101      075
101      075
401      075
;

Data final;
  do until (last.id);
    set Data1 (in=a) Data2 (in=b);
    by id;
    if a then flag1=a;
    if b then flag2=b;
  end;

  data1_only = flag1 and not flag2;
  data2_only = flag2 and not flag1;
  data1_and_2 = flag1 and flag2;

  do until (last.id);
    set Data1 (in=a) Data2 (in=b);
    by id;
    OUTPUT;
  end;

  drop flag1 flag2;
run;
...