if n lt 3 then call missing(cmp,dh);
run;[/code:2sp6r820]作者: shiyiming 时间: 2009-7-8 17:13 标题: Re: 求助:一个折磨了我很久的问题 十分感谢hopewell兄,就是这个意思。但我在上面列的数据集是一个样例,处理的实际数据比较大,求中值和最值时面临的样本区间也比较长(比如是一个100日的移动窗口),代码能扩展一下解决这个问题么?作者: shiyiming 时间: 2009-7-8 23:51 标题: Re: 求助:一个折磨了我很久的问题 不知道效率如何?还有更好的方法吗?
[code:bmlg1jmx]/* 设定滞后量 */
%let lag_n=10;
/* 创建模拟数据 */
data raw_data;
do code=1 to 100;
do date='01jan09'd to '30jan09'd;
p=ceil(10*ranuni(123));
output;
end;
end;
format date yymmdd10.;
run;
/* 拷贝模拟数据 */
data copy_data;
set raw_data;
rename code=copy_code
date=copy_date
p=copy_p
;
run;
/* 使用HASH ITERATOR创建中间变量 */
data temp_data(drop=copy_code copy_date copy_p rc);
if _n_=1 then
do;
declare hash p_hash(dataset:'copy_data',hashexp:10,ordered:'ascending');
p_hash.definekey ('copy_code','copy_date');
p_hash.definedata('copy_code','copy_date','copy_p');
p_hash.definedone();
call missing(copy_code,copy_date,copy_p);
declare hiter p_hiter('p_hash');
end;
set raw_data;
length temp $500;
flag=0;
rc=p_hiter.first();
do while(rc eq 0);
if (code=copy_code) and (0<=date-copy_date<&lag_n) then
do;
if flag=0 then temp=cat(copy_p);
else temp=catx(',',temp,copy_p);
flag+1;
end;
rc=p_hiter.next();
end;
run;