2016-12-18 8 views
0

SASのデータステップ内のループでマクロ変数を呼び出す方法を理解しようとしていますが、紛失しています。私は14のマクロ変数を持っており、それぞれをベクトルのエントリーと比較する必要があります。私は試しました:SASのループでマクロ変数を解決する方法

data work.calendrier; 
set projet.calendrier; 
do i=1 to 3; 
if date= "&vv&i"D then savinglight = 1; 
end; 
run; 

しかし、それは動作していません。変数vv1〜vv3は日付変数です。たとえば、このコードは次のように動作します。

data work.calendrier; 
set projet.calendrier; 
*do i=1 to 3; 
if date= "&vv1"D then savinglight = 1; 
*end; 
run; 

しかし、ループではマクロ変数を解決できません。

+0

配列の代わりにマクロ変数を使用する理由はありますか? – Reeza

+0

あなたのコードからは、「ベクトル」ではなく、1つの変数しかないようです。 DATEの値がマクロ変数の値のいずれかと一致する場合は、新しい変数を1に設定しますか? – Tom

答えて

0

vv1、vv2、vv3のような番号インデックスを持つマクロ変数を参照する場合は、最初に&を解決する必要があります。

SASには、値がデータステッププロセッサに到達する前に値を解決する別のマクロプロセッサがあります。

基本的に、あなたはあなたのマクロ変数の先頭に余分なアンパサンドを追加する必要があります。ここでは何が起こる

&&vv&i -> &vv1 -> "Value of vv1" 
&&vv&i -> &vv2 -> "Value of vv2" 
&&vv&i -> &vv3 -> "Value of vv3" 

は、それが休憩を見つけるまでSASはアンパサンド後の情報を読み取ることです。その後、SASは& &を単一の&として解決し、数値として& iが解決するまで続きます。次に、必要な変数& vviを残します。

この興味深いトピックに関する情報源のカップル:SASは、コンパイルし、データのステップを実行する前に

http://www2.sas.com/proceedings/sugi29/063-29.pdf http://www.lexjansen.com/nesug/nesug04/pm/pm07.pdf

0

マクロ変数の参照が解決されます。最初にSASステートメントを使用する方法を理解し、必要に応じてマクロコードを使用してそれらのステートメントを生成することができます。

変数の値が値のリストのいずれかと一致するかどうかをテストする場合は、IN演算子の使用を検討してください。

0

マクロを使用する必要があります。

%let vv1 = 9; 
%let vv2 = 2; 
%let vv3 = 10; 

data have; 
drop i; 
do i = 1 to 5; 
date = i; 
output; 
end; 
run; 

%macro test; 
data test; 
set have; 

%do i=1 %to 3; 
if date= &&vv&i then savinglight = 1; 
%end; 
run; 
%mend test; 

%test; 
関連する問題