|
|
Re: 求助:一个折磨了我很久的问题
总算貌似看懂徐福贵的程序了,能写成这样真是太神奇了 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
如果我理解的不对,望指点,谢谢.
[code:2q25c896]data final_data2(drop=index pp:);
/* before break-event */
array pp[0:%eval(&lag_n-1)] pp0-pp9; /* 声明数组 */
index = 0; /* 在每个do组开始前将数组下标变量置为0 */
/* nested do loop */
/* 对数据集观测的读入输出均在do-loop中,implied Data step loop仅起到赋初值的作用 */
/* 在每次do-loop的一次循环中仅将当前记录的p值赋予数组中的相应下标的元素,充分利用变量值在PDV中的retain特性 */
/* 示意:
obs p |pp0 pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9
-----------------------------------------------
0 8 |(8) . . . . . . . . .
1 4 | 8 (4) . . . . . . . .
2 2 | 8 4 (2) . . . . . . .
3 10 | 8 4 2 (10) . . . . . .
4 4 | 8 4 2 10 (4) . . . . .
5 3 | 8 4 2 10 4 (3) . . . .
6 8 | 8 4 2 10 4 3 (8) . . .
7 4 | 8 4 2 10 4 3 8 (4) . .
8 2 | 8 4 2 10 4 3 8 4 (2) .
9 2 | 8 4 2 10 4 3 8 4 2 (2)
-----------------------------------------------
10 8 |(8) 4 2 10 4 3 8 4 2 2
11 5 | 8 (5) 2 10 4 3 8 4 2 2
12 10 | 8 5 (10) 10 4 3 8 4 2 2
13 3 | 8 5 10 (3) 4 3 8 4 2 2
14 8 | 8 5 10 3 (8) 3 8 4 2 2
15 6 | 8 5 10 3 8 (6) 8 4 2 2
16 6 | 8 5 10 3 8 6 (6) 4 2 2
17 9 | 8 5 10 3 8 6 6 (9) 2 2
18 2 | 8 5 10 3 8 6 6 9 (2) 2
19 9 | 8 5 10 3 8 6 6 9 2 (9)
*/
do _n_=1 by 1 until(last.code); /* 使用dow-loop */
set raw_data;
by code;
pp[index] = p; /* 根据下标变量为数组赋值 */
index = mod(index+1, &lag_n); /* 改变下标变量的值,当读第11、21、31...条记录时index=0(初值为0) */
if _n_>=&lag_n then do; /* 计算部分 */
cmp = max(of pp[*]) - min(of pp[*]);
dh = median(of pp[*]);
end;
output; /* 在do-loop的每次循环结束后输出观测 */
end;
/* after break-event */
/* 取消了隐含的outout语句 */
run;[/code:2q25c896] |
|