给出两个简单的数据集A和B如下
DATA A; INPUT X @@;
CARDS;
1 2 3 4
RUN;
DATA B; INPUT Y @@;
CARDS;
1 2
RUN;
我正在尝试创建两个名为C和D的数据集,一个使用重复的SET和OUTPUT语句,另一个使用DO循环。
DATA C;
SET B;
K=1; DO; SET A; OUTPUT; END;
K=K+1; DO; SET A; OUTPUT; END;
K=K+1;
RUN;
DATA D;
SET B;
DO K = 1 TO 2;
SET A; OUTPUT;
END;
RUN;
我认为C和D应该与DO循环相同,应该重复那些语句,如C的DATA步骤所示,但事实证明它们是不同的。
Dataset C:
Obs Y K X
1 1 1 1
2 1 2 1
3 2 1 2
4 2 2 2
Dataset D:
Obs Y K X
1 1 1 1
2 1 2 2
3 2 1 3
4 2 2 4
有人可以解释一下吗?
答案 0 :(得分:3)
第一个数据步骤中的两个SET A
语句是独立的。因此,在数据步骤的每次迭代中,它们都将读取相同的观察结果。所以就好像你改变了这一步。
data c;
set b;
set a;
do k=1 to 2; output; end;
run;
第二个数据步骤中的SET A
语句将在数据步骤的第一次迭代中执行两次。因此,对于数据步骤的每次迭代,它将从A
读取两个观察值。
如果您真的想要进行交叉连接,则需要使用point=
选项,以便重新读取其中一个数据集。
data want ;
set b ;
do p=1 to nobs ;
set a point=p nobs=nobs ;
output;
end;
run;
答案 1 :(得分:2)
你的表B有两个obs,所以你的代码只会进行两次迭代:
Retain
关键字。调试:
迭代1当前视图:
Obs Table X
1 A 1
Obs Table Y k
1 B 1 1
输出:
K=1; DO; SET A; OUTPUT; END;
Obs Y K X
1 1 1 1
K=K+1; DO; SET A; OUTPUT; END;
Obs Y K X
2 1 2 1
迭代2当前视图:
Obs Table X
2 A 2
Obs Table Y k
2 B 2 1
输出:
K=1; DO; SET A; OUTPUT; END;
Obs Y K X
3 2 1 2
K=K+1; DO; SET A; OUTPUT; END;
Obs Y K X
4 2 2 2