как собрать одну переменную из нескольких строк в новую переменную в существующей таблице - PullRequest
0 голосов
/ 07 октября 2018

У меня проблема с SAS, как решить следующий случай:

Исходные данные:

 gvkey     lender        
000001    citigroup       
000001    abn group       
000001    jpmorgan        
000002    jpmorgan        
000003    morgan stanely  
000003    cibc            

Результат, который я хотел бы получить:

   gvkey     lender          lender_set
  000001    citigroup       citigroup; abn group; jpmorgan
  000001    abn group       citigroup; abn group; jpmorgan
  000001    jpmorgan        citigroup; abn group; jpmorgan
  000002    jpmorgan        jpmorgan
  000003    morgan stanely  morgan stanely; cibc
  000003    cibc            morgan stanely; cibc

Могу ли я спросить, как использовать SAS для достижения результата, пожалуйста?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Поскольку вы хотите сгенерировать одно и то же значение для нового столбца для всех наблюдений группы, это хорошее место, чтобы использовать двойной цикл DOW.Первый цикл вычислит новый столбец, а второй перечитает данные и выведет результаты.

data want;
  do until (last.gvkey);
    set have;
    by gvkey ;
    length lender_set $200 ;
    lender_set=catx('; ',lender_set,lender);
  end;
  do until (last.gvkey);
    set have;
    by gvkey ;
    output;
  end;
run;

Убедитесь, что вы определили LENDER_SET достаточно долго, чтобы сохранить возможные результаты.Также убедитесь, что он не существует во входном наборе данных.

0 голосов
/ 08 октября 2018

что-то вроде ниже.

data have;
input gvkey $    lender & $20.;
 datalines;       
 000001    citigroup       
 000001    abn group       
 000001    jpmorgan        
 000002    jpmorgan        
 000003    morgan stanely  
 000003    cibc     
 ;

proc sort data=have out =have1;
by gvkey;
run;

/* get the concataned value for gvkey_set*/
data have2;
do until(last.gvkey);
set have1;   
by gvkey;
length gvkey_set $100.;
 gvkey_set= catx('; ', gvkey_set,lender);
if last.gvkey then output;
end;
run;

 /* join back concatenated values*/
proc sql;
create table want as 
select a.* ,b.gvkey_set
from have a
inner join 
have2 b
on a.gvkey = b.gvkey;
...