SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2009-8-9 02:37:50 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2009-8-10 15:54:13 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

thx <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 23:12 , Processed in 0.066064 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表