I prefer to Linlin's solution. data have;
input var $40.;
datalines4;
D01;D02;D03;D04;D05;
D01;D02;D03;D05;
D10;D11;D12;D13;D17;D20;D21;D22;
;;;;
run;
data temp1(keep=group d num);
set have;
group+1;
i=1;
d=substr(scan(var,i,';'),1,1);
num=input(substr(scan(var,i,';'),2),best8.);
do while(not missing(d));
output;
i+1;
d=substr(scan(var,i,';'),1,1);
num=input(substr(scan(var,i,';'),2),best8.);
end;
run;
proc sort data=temp1;by group num;run;
data temp2(keep=group num);
set temp1(rename=(num=_num));
by group;
if last.group then do;
do num=1 to _num;
output;
end;
end;
run;
data x;
merge temp1 temp2;
by group num;
if missing(d) then d='-';
run;
data want(keep=have want);
set x;
by group;
length have want $ 400;
retain have want;
if first.group then call missing(want,have);
if d ne '-' then have=catx(';',have,cats(d,num));
want=cats(want,d);
if last.group then output;
run;
Ksharp
... View more