SAS DO循环与SET语句
给出两个简单的数据集A和B,如下所示SAS DO循环与SET语句,sas,Sas,给出两个简单的数据集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 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循环相同,DO循环应该重复这些语句,如C的数据步骤所示,但事实证明它们是不同的
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
有人能解释一下吗?您的表B有两个OB,因此您的代码将只执行两次迭代:
Retain
关键字Obs Table X
1 A 1
Obs Table Y k
1 B 1 1
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
1 1 1 1
K=K+1; DO; SET A; OUTPUT; END;
Obs Y K X
2 1 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
迭代2当前视图:
Obs Table X
1 A 1
Obs Table Y k
1 B 1 1
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
1 1 1 1
K=K+1; DO; SET A; OUTPUT; END;
Obs Y K X
2 1 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
第一个数据步骤中的两个
SET A
语句是独立的。因此,在数据步骤的每次迭代中,它们都将读取相同的观察结果。因此,就好像您运行了此步骤
data c;
set b;
set a;
do k=1 to 2; output; end;
run;
第二个数据步骤中的SET
语句将在数据步骤的第一次迭代中执行两次。因此,对于数据步骤的每次迭代,它将从A
读取两个观察值
如果您真的想进行交叉连接,您需要使用point=
选项,以便可以重新读取其中一个数据集
data want ;
set b ;
do p=1 to nobs ;
set a point=p nobs=nobs ;
output;
end;
run;
谢谢您的回答,是否可以修改“数据C;”使其产生与“数据D;”相同的结果?所述差异表明我对DO循环如何运行的理解可能不正确。不能让执行两个不同的SET语句的操作与执行一个SET语句两次的操作相同。您可以为两个不同的SET语句使用两个不同的POINT=指针变量。请注意,第一个数据步骤中的DO/END块没有做任何事情。您可以删除DO和END语句,如果没有它们,该步骤将完全相同。