Скопируйте набор данных B для каждой переменной в наборе данных A

У меня есть два следующих набора данных:

Набор данных A:

ID  
A      
B      
C 

Набор данных B:

Age 
35        
49      
53

И я хочу скопировать и вставить B в каждый идентификатор A:

ID  Age 
A   35
A   49
A   53
B   35
B   49
...

На данный момент я делаю это с помощью цикла %do, но есть ли более элегантный способ сделать это? Например, с одним PROC SQL или Datastep?

заранее спасибо


person Palmeida    schedule 13.10.2020    source источник
comment
Покажи свой код. Есть ли причина, по которой вы делаете это с %do ? Для SQL загляните в CROSS JOIN   -  person Richard    schedule 13.10.2020
comment
@ Ричард просто потому, что я не мог придумать, как сделать это по-другому. Спасибо за указание перекрестного соединения. Это также работает. Кроме того, я не знал, что это называется декартовым произведением, которое поможет мне с поиском. Цикл Do запутан (поэтому требуется более простое решение).   -  person Palmeida    schedule 13.10.2020


Ответы (2)


Вы можете использовать SQL для выполнения декартова произведения, чтобы получить все комбинации.

Например:

/* setup id data */
data have1;
   input id $char1.;
   datalines;
A
B
C
;

/* setup age data */
data have2;
   input age 8.;
   datalines;
35
49
53
;

/* perform Cartesian product */
proc sql noprint;
   create table
      want
   as
   select
      *
   from
       have1
      ,have2
   ;
quit;
person Amir    schedule 13.10.2020

Нет необходимости в макрокоде. Вы можете использовать опцию POINT= в операторе SET, чтобы сделать это на шаге данных.

data want;
  set a;
  do p=1 to nobs;
    set b point=p nobs=nobs;
    output;
  end;
run;
person Tom    schedule 13.10.2020