Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 如何将多行中的一个变量收集到现有表中的新变量中_Sas - Fatal编程技术网

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

Sas 如何将多行中的一个变量收集到现有表中的新变量中,sas,Sas,我遇到了如何解决以下情况的SAS问题: 初始数据: gvkey lender 000001 citigroup 000001 abn group 000001 jpmorgan 000002 jpmorgan 000003 morgan stanely 000003 cibc 我希望得到的结果是: gvkey lender

我遇到了如何解决以下情况的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来实现这个结果吗?提前谢谢。

如下所示

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;

由于您希望为一个组的所有观测值的新列生成相同的值,因此最好使用双道循环。第一个循环将计算新列,第二个循环将重新读取数据并输出结果

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;

确保您定义了足够长的时间来保存可能的结果。还要确保输入数据集中不存在该结果集。

能否格式化所需的结果集,使其更具可读性?