[英]How to work SET statement in a DO loop in SAS?
我在 SAS 研究了 Do 循環中的 SET 語句,但我不明白如何在 DO 循環中使用 SET 語句。
我創建了以下示例數據集 a1:
/* Create data a1 */
data a1 ;
input fruit $ ;
cards ;
melon
apple
orange
;
run ;
proc print data=a1 ;
title "Results of a1" ;
run;
然后,我創建以下新數據集 c1:
/* Create data c1 using a1 -- This is a upper code block */
data c1 ;
do i = 1 to 3 ;
set a1 ;
count + 1 ;
N_VAR = _N_ ;
ERR_VAR = _ERROR_ ;
output ;
end;
run ;
proc print data=c1 LABEL ;
LABEL N_VAR = "_N_" ;
LABEL ERR_VAR = "_ERROR_" ;
title "Results of c1" ;
run ;
問題:為什么上面的代碼與下面的代碼塊沒有相同的 output? 我不明白如何在 DO 循環中使用 SET 語句。 我缺少什么概念?
/* My expectation for c1 -- This is a below code block */
data my_expectation ;
input i fruit $ count N ERROR ;
cards ;
1 melon 1 1 0
1 apple 2 2 0
1 orange 3 3 0
2 melon 4 1 0
2 apple 5 2 0
2 orange 6 3 0
3 melon 7 1 0
3 apple 8 2 0
3 orange 9 3 0
;
run;
proc print data=my_expectation label ;
LABEL N = "_N_" ;
LABEL ERROR = "_ERROR_" ;
title "The result that I expected for c1" ;
run ;
我在下面附上了結果圖像文件。
感謝您的關注。
每條SET
語句設置一個獨立的讀數stream。
DATA 步是一個隱式循環。
在DO
循環迭代 3 次后,隱式 DATA 步循環將控制返回到步的頂部。
在第二次隱式迭代中,進入DO
循環,並且在其第一次迭代中到達SET
語句(第 4 次)。 輸入數據集 ( A1
) 沒有更多觀察值,因此 DATA 步驟結束。
您可以使用此版本的 DATA 步觀察流程行為:
data c1 ;
put 'TOP';
do i = 1 to 3 ;
put i= 'pre SET';
set a1 ;
put i= 'post SET';
count + 1 ;
N_VAR = _N_ ;
ERR_VAR = _ERROR_ ;
output ;
end;
put 'BOTTOM';
run;
在旁邊:
OUTPUT 當一個數據步沒有任何顯式語句時,該步會隱式地 output 當控制到達步底部時觀察 -- 有阻止流到達底部的語句,例如RETURN
語句或子集IF
失敗的陳述。
我回答了你為什么的問題,@Tom 向你展示了如何使用 DATA 步驟產生你的預期結果。 結果是 SQL 也可以執行的交叉連接:
data a1 ;
input fruit $ ;
cards ;
melon
apple
orange
;
data replicates;
do i = 1 to 3;
output;
end;
run;
proc sql;
create table want as
select i, a1.*
from replicates cross join a1
;
quit;
如果要 output 每次觀察 3 次,則在 SET 之后移動 DO 循環。
set a1;
do i=1 to 3; output; end;
如果你真的想讀三遍數據集,那么你要么需要三個單獨的 SET 語句
i=1;
set a1;
output;
i=2;
set a1;
output;
i=3;
set a1;
output;
或者使用 POINT= 選項來顯式控制您正在使用 SET 語句讀取的觀察結果。
do i=1 to 3 ;
do p=1 to nobs;
set a1 point=p nobs=nobs ;
output;
end;
end;
stop;
大多數 DATA 步在讀取輸入時停止,因為 POINT= 選項不會發生這種情況,因此您需要 STOP 語句來防止數據步永遠重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.