如何将几行中的一个变量收集到现有表中的新变量中

时间:2018-10-07 18:31:22

标签: sas

我在解决以下情况时遇到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 :(得分:1)

由于您要为组的所有观测值为新列生成相同的值,因此使用双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的时间足够长,以容纳可能的结果。还要确保它在输入数据集中还不存在。

答案 1 :(得分:0)

如下所示。

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;