2017-02-27 19 views
0

私は一般的にProc ExpandとSASについて学びたいと思っています。私はtransformoutで複数の操作が一緒に働く方法について多くの光を当てることができませんでした。以下のコードを実行すると、SASは単純に2行分の後方移動合計を計算しているようです。ここでトランスフォームでの複数の演算はどのように機能しますか?

proc expand data=averages out=transformed; 
id date; 
convert x=y/transformout=(reverse movsum 2 movsum 1 reverse); 
by type notsorted; 
run; 

は、結果のサンプルです:

y  x 
13372 1225 
20564 12147 
16140 8417 
14446 7723 
13097 6723 
15976 6374 
11497 9602 
12704 1895 
18043 10809 

私は、コードを少し変更すると、私は数字がSASで生成される方法で任意のパターンを見つけることができません。ここに変更されたコードがあります。ここで

proc expand data=averages out=transformed; 
id date; 
convert x=y/transformout=(reverse movsum 5 movsum 3 reverse); 
by type notsorted; 
run; 

は、このコードの結果は以下のとおりです。

y  x 
116458 1225 
112540 12147 
106559 8417 
103634 7723 
107010 6723 
103592 6374 
103655 9602 
100326 1895 
94840 10809 

どうSASは、このような状況で複数の操作を処理しますか?これまで私はGoogle上で何かを見つけたり、コードを使ってさまざまなシナリオを試したりすることができませんでした。

+0

'BY'ステートメントで言及されている' TYPE'変数はどこにありますか?または、TYPEの1つのレベルに対して投稿したすべての値ですか? – Tom

+0

@Tom申し訳ありませんが、そのコードを明確にしたり削除したりする必要があります。投稿された値はすべて同じTYPEです。 – Jarom

答えて

0

これは、中間結果を計算してその関数を適用しているようです。したがってmovsum 5 movsum 3の使用は、movsum 5を使用して1つのprocステップを実行した後、movsum 3を使用して別のステップを実行した場合と同じです。

このプログラムを実行するとします。

data have ; 
    input x @@ ; 
cards; 
1225 12147 8417 7723 6723 6374 9602 1895 10809 
; 

proc expand data=have out=out1 ; 
    convert x=movsum2/transformout=(reverse movsum 2 reverse); 
    convert x=movsum5/transformout=(reverse movsum 5 reverse); 
run; 

proc expand data=out1 out=final ; 
    convert x=y1/transformout=(reverse movsum 2 movsum 1 reverse); 
    convert movsum2=y2/transformout=(reverse movsum 1 reverse); 
    convert x=z1/transformout=(reverse movsum 5 movsum 3 reverse); 
    convert movsum5=z2/transformout=(reverse movsum 3 reverse); 
run; 

Y1 = Y2、Z1 = Z2が表示されます。

関連する問題