簡體   English   中英

如何在 SAS 的 DO 循環中使用 SET 語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM