次のコードの理解に問題があります。このスニペットは、目標値(sasuser.ctargets
)と実際の値(sasuser.monthsum
)を比較するデータセットを出力するものとします。観測は月と年が一致し、targets
配列に移入されます。コードは正確に動作するはずですが、私の心にはそうしてはいけません。入れ子になったDOループでアレイを使ってSASネストしたdoループ
ルック:
Targets
はyear
とj
で入れ子になったDOループにインデックスされます。私は外部ループが3つの繰り返し(i=1 to 3
)を使用していることを理解しています。年変数(1997-1999)の各値に対して1つです。ただし、Year
はDOループの外側で宣言されます。したがって、自動変数_n_
がDOループの最初の反復でターゲット配列を作成した場合、targets
配列はどのように1998年と1999年に正しく挿入され、DATAステップの後続の反復まで読み込まれませんか? year
はイテレータとしてどのように機能しますか?
data work.lookup1;
array targets(1997:1999,12) _temporary_;
if _n_=1 then do i=1 to 3;
set sasuser.ctargets;
array mnth(*) Jan--Dec;
do j=1 to dim(mnth);
targets(year,j)=mnth(j);
end;
end;
set sasuser.monthsum(keep=salemon revcargo monthno);
year=input(substr(salemon,4),4.);
ctarget=targets(year,monthno);
format ctarget dollar15.2;
run;
ああ、反復は変数の数から来ますか?各列には12ヶ月の値+年があります。最初の反復:1997年の12ヶ月.2回目の反復:1998年の値13-24など?今それは理にかなっています。ありがとう – Adam