|
|
Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?
[code:1z2qnzxk]data a;
input ID$ Date yymmdd8. Num Act;
format Date yymmdd10.;
cards;
001 08-07-01 100 1
001 08-07-02 50 0
001 08-07-06 30 0
001 08-07-10 100 1
001 08-07-15 60 0
002 08-07-01 100 1
002 08-07-05 40 1
002 08-07-06 30 0
;
run;
proc sort data=a out=a1;
by id date;
run;
data b(keep=id date num rename=(date=remain_date num=remain_num)) c(keep=id ft_obs );
set a;
by id date;
if first.id then do;ft_obs=_n_;output c; end;
output b;
where act=1 ;
run;
data result;
set a;
by id;
if _n_=1 then do;
length id $8 ft_obs 8;
declare hash myhash(dataset:"c");
myhash.definekey("id");
myhash.definedata("ft_obs");
myhash.definedone();
call missing(ft_obs);
end;
if first.id then do;
_rc=myhash.find();
retain move_point;
move_point=ft_obs;
length temp_remain_date temp_remain_num 8;
retain temp_remain_date temp_remain_num;
set b(drop=id) point=move_point;
temp_remain_date =remain_date ;
temp_remain_num =remain_num;
end;
if act=0 then do;
_temp_rm_num=num;
startget:;
_temp_rm_num=sum(temp_remain_num,-_temp_rm_num);
if _temp_rm_num < 0 then do;
rlt_day=sum(rlt_day,(date-temp_remain_date)*temp_remain_num/num);
move_point+1;
set b(drop=id) point=move_point;
temp_remain_date =remain_date ;
temp_remain_num =remain_num;
_temp_rm_num =-_temp_rm_num;
goto startget;
end;
else do;
rlt_day=sum(rlt_day,(date-temp_remain_date)*(temp_remain_num-_temp_rm_num)/num);
temp_remain_num=_temp_rm_num;
end;
end;
keep ID Date Num Act rlt_day;
run;
[/code:1z2qnzxk] |
|