个人理解一个数据步应该只有一个PDV,用于储存所有的变量名和需要处理的数据.
指针可能会有多个, 比如整个数据步的指针可以指向整段程序的某一段, 如第一个set语句,do-
loop, run 语句等。 而set语句的指针 point= 指向第几行数据, do-loop的指针指向第几个循环参数.
在上面的程序里, 当数据步指针指向do-loop时, 会hold住第一个set语句读入的数据, 并执行do-loop内的语句. do-loop每循环一次, 就用第二个set语句从第二个数据集读入一条由 point= 指定的观测, 然后执行IF语句.
do-loop运行时数据步的指针始终指向do-loop,而第二个set语句随着循环参数的变化指向第二个数据集的不同观测并读取数据。
do-loop运行时, PDV 中由do-loop前set语句读取的数据集 1 的数据保持不变,与do-loop内部有关的数据不断变化,满足一定条件的用output语句输出到结果数据集。
两个数据集的变量名是在数据步开始运行前存入PDV的. 如果两个数据集有相同的变量名,第二个set语句读入的数据会覆盖第一个set语句读入的数据值。
这样说来上面的code有点费解. 因此做了点修改,可能会清楚些. 由于do-loop从_n_+1开始, 所以局限于找出 id2中的重复值出现在id1中相同值的后面.
- data tem;
- input id1 id2;
- cards;
- 1 2
- 2 1
- 4 7
- 5 8
- 6 9
- 8 5
- ; run;
- data repeated;
- set tem (rename=(id1=_id1 id2=_id2));
- n = _n_;
- do i = n+1 to nobs;
- set tem nobs=nobs point=i;
- if _id1 = id2 then output;
- end;
- keep id1 id2;
- run;
- proc sql;
- create table want as
- select *
- from tem
- except select * from repeated;
- quit;


雷达卡

京公网安备 11010802022788号







