我在解决以下情况时遇到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来达到效果?预先感谢。
答案 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;