2017-03-29 19 views
0

私が書いたSASコードに触れて、より効果的に実行したいコードを見つけました。私は時系列データセットを 'Forecasts'と呼んでいます。これはちょうど日付と 'Forecast'変数から成っています。SAS:データステップでマクロ変数を数値として使用する

私は、この変数を取り、基本的には一連の変数にそれを切り刻む、1つの日付を表す各1に、コードの単純なブロックを書いた:

data forecasts; 
set forecasts; 
    obs=_n_; 
    array r(241); 
    do i=1 to dim(r); 
    if obs=i then r(i)=Forecast; 
    end; drop i; drop obs; drop forecast; 
run; 

ただし、R「(241」)の一部このコードは本当に私を悩ます。

array r(&n) 

など:、のようなものを私はすでに、私は(「N」と呼ばれる)は、この操作を実行する必要が倍の数に対応したマクロ変数を持っている、と私はむしろちょうど直接配列の宣言に差し込みます。

マクロ変数は明らかにテキストと見なされるため、マクロ変数をデータステップにインポートしても、変数n(nは数字ではない)が読み込まれないため、バリアントr(& n)は機能しません。 。このデータ・ステップ全体をより広いマクロにラップするのではなく、どのようにして 'n'をデータ・ステップに引き込み、それを数値に変換してこの操作が機能するのでしょうか?

答えて

2

ステートメント:

array r(&n) ; 

マクロ変数が定義され、整数値を有すると仮定すると、微細であるべきです。どのように使用しようとしているか(および失敗したログメッセージ)を示してください。マクロ変数をデータステップにインポートする必要はありません。マクロ変数は、SASコードに解決することが主な仕事であるため、テキストです。

18 %let n=3; 
19 data _null_; 
20  array r{&n}; 
21  do i=1 to dim(r); 
22  put i=; 
23  end; 
24 run; 

i=1 
i=2 
i=3 
+0

奇妙な話、私は私が使用して&Nがあなたの時間を無駄にするために申し訳ありませんが、うまく動作しない過度に複雑コールのすべての種類などを使用して、ちょうど&Nを除いてすべてを試みだと思います。 –

2

このようにする必要はありません。このためにはPROC TRANSPOSEが存在します。次に、変数/行がいくつあるか知る必要はありません。あなたが実際に243行をしたいが、1つだけしたくない場合は

data forecast; 
    call streaminit(7); 
    do id = 1 to 243; 
    forecast = rand('Normal')*5; 
    output; 
    end; 
run; 

proc transpose data=forecast out=forecasts prefix=r; 
    by id; 
    id id; 
    var forecast; 
run; 

は、byid文をダンプします。

これをデータステップで実行したい場合でも、これをかなり速く行うことができます(今は241 * 241回のチェックで、241回のみ必要です)... setを内部に入れますループ。ここでは、自動的にドロップされた変数_n_を使用してループを繰り返します。

data forecasts; 
    do _n_ = 1 by 1 until (eof); 
    set forecast end=eof; 
    array r(243); 
    r[_n_] = forecast; 
    output; *if you actually want one row per original row still; 
    call missing(r[_n_]); *clear it out; 
    end; 
    drop forecast; 
run; 
+0

note 241ではなく243を使用していますので、正しい値に調整してください。 – Joe

+0

私のデータセットは実際には241変数よりかなり大きいので、これを把握して時間を節約するために実装します。 –

+0

私は、あなたがこれをやっていることに応じて、これを行うより良い方法があるかもしれないことにも気づくでしょう - たとえば、対角行列を作成する場合、 'PROC IML'がそれを行う場所です。より高度な回帰/等のいくつか。型分析ルーチンもこれを行うことができます。 – Joe

関連する問題