2017-02-22 46 views
0

我運行一個程序是這樣的:SAS輸出語句,並保持語句

data january; 
set allmonths (keep=product month num_sold cost); 
if month='jan' then output january; 
sales=num_sold*cost; 
put sales; 
keep product sales; 
run; 

數據集月份包含兩個變量:產品和銷售。但銷售價值缺失。

product sales 
a  . 

我有點理解爲什麼銷售值缺失,因爲它沒有在輸出語句前的allmonth數據集中定義。

那麼爲什麼如果輸出語句沒有它,這個變量可以包含在數據集1月份。保持語句可以包括每個數據集列出的每個變量,然後爲什麼沒有值寫入數據集。

我想我可能知道原因。保持聲明是關於變量的,輸出是關於觀察值的。

但我還是想問問和學習。

謝謝!

回答

1

Keep是在開始處理數據之前在數據步驟的編譯階段處理的那些SAS語句之一。在執行if語句和輸出語句之前,決定在輸出表中保留哪些變量(由於keep語句)。編寫代碼的等效方式可以更清楚的是:

data january (keep= product sales); 
set allmonths (keep=product month num_sold cost); 
if month='jan' then output january; 
sales=num_sold*cost; 
put sales; 
run; 

爲了簡化它,讓它做你可能想要的東西:

data january(keep=product sales); 
set allmonths(keep=product month num_sold cost); 
where month='jan'; 
sales=num_sold*cost; 
run; 
+0

謝謝!清除我的想法。 – Lin

0

OUTPUT聲明立即運行。因此,在您計算SALES的值之前,它正在寫入記錄。嘗試在IF/THEN/OUTPUT語句之前添加另一個PUT語句,您可以看到將輸出的值。

對於此問題,您可能希望使用子集化IF語句或WHERE語句,而不是顯式運行OUTPUT語句。如果您刪除了OUTPUT語句,那麼數據步驟將自動輸出數據步驟結束時的記錄。

data january; 
    set allmonths; 
    if month='jan'; 
    sales=num_sold*cost; 
    keep product sales; 
run; 
+0

謝謝!你和Paul的答案描述了Output和Keep語句在數據步驟中的工作原理。很有幫助。謝謝你們! – Lin