2017-02-22 2 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; 

データセット1月は、2つの変数が含まれています。しかし、販売価値はありません。

product sales 
a  . 

売上値が欠落している理由は、それが出力文の前にデータセットallmonthで定義されていないので、私は一種の理解。

なぜ、この変数が出力文に含まれていない場合、なぜこの変数をデータセット1月に含めることができるのですか? Keepステートメントには、すべてのデータセットにリストされているすべての変数を含めることができます。その場合、データセットに値を書き込む必要はありません。

私はその理由を知っているかもしれないと思います。 Keepステートメントは変数に関するもので、出力は観測に関するものです。

しかし、私は依然として質問し、学びたいと思っています。

ありがとうございました!

答えて

1

Keepは、データ処理の開始前にデータステップのコンパイル段階で処理されるSASステートメントの1つです。 ifとoutput文が実行される前に、どの変数を出力表1に保存するかの決定が(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ステートメントを追加して、出力される値を確認してください。

この問題では、明示的にOUTPUTステートメントを実行する代わりに、IFセッティングまたはWHEREステートメントのサブセットを使用することをお勧めします。 OUTPUT文を削除すると、データ・ステップはデータ・ステップの最後に自動的にレコードを出力します。

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

ありがとう!あなたとPaulの答えは、出力と保持のステートメントがデータステップでどのように機能するかを説明しました。非常に役立ちます。皆さん、ありがとうございました! – Lin