1

コードが 1 から 82 までの数字を反復し、proc formatそのマクロ変数を作成するときにステートメントで定義された形式を割り当てる次のマクロを作成しました。

%macro metric_var;

/*macro to define 86 metric variables using proc format statement. this only needs doing once. to save processing time*/
/*this macro is outside of the main macro loop and the proc format statement is outside the do loop within the macro*/
/*as again it only needs defining once.*/

proc format;
value metricvar 

1 = a 2 = y 3 = b 4 = d 5 = b2
6 = r1 7 = b3 8 = q 9 = p 10 = o 

11 = c1 12 = d1 13 = c 14 = d2
15 = c6  16 = t1 17 = k2 18 = p2

19 = c8 20 = m5 21 = c3 22 = m6
23 = g 24 = m7 25 = h 26 = m8
27 = k1  28 = m3 29 = l 30 = m4
31 = l1  32 = t8

33 = w1 34 = g1  35 = w4 36 = g3
37 = p1 38 = g4 39 = m 40 = g5
41 = m2 42 = g6 

43 = k 44 = v 45 = j 46 = j1
47 = j5 48 = j3 49 = k4 50 = f6
51 = j6 52 = n 53 = k5 54 = n4 
55 = w 56 = s 57 = s1 58 = x
59 = j2

60 = v 61 = a5 62 = b6 63 = k3
64 = t7 65 = a2 66 = t6 67 = i5 

68 = l2 69 = e 70 = e7  71 = e8 
72 = e9 73 = b4 74 = j4 75 = p5  
76 = p6 77 = r 78 = r2 79 = r5   
80 = r6  81 = r7 82 = s7

/*don't forget now runs to 86 metrics*/
;
run;

%let metvar1 = 1;
%let metvar2 = 82;

%do U = &metvar1. %to &metvar2. %by 1;


data _null_;
a = &u.;
call symput('myvar',(put(a,metricvar.)));
run;

%let myvar_&u. = &myvar.;
%put &myvar.;
%put &myvar_&u.;


%end;
%mend;

%metric_var;

これで、マクロ変数&myvar.は正しく機能し、希望どおりに昇順で値が割り当てられます。

ただし、この 1 つの変数には新しい値が 82 回割り当てられ、プロセスの最後には最後の反復の値が割り当てられます。

この行で私が試みたのは、それぞれが異なる値を持つよう%let myvar_&u. = &myvar.;に呼び出される 82 個の個別のグローバル変数を作成することです。&myvar_1.&myvar_82.

ログが実行されると、次の警告が表示されます

WARNING: Apparent symbolic reference MYVAR_ not resolved.
&myvar_79

必要な最後の変数が正しく割り当てられていないようで、その理由がわかりません。

問題が何であるかについて誰か提案がありますか?

ありがとう

4

2 に答える 2

2

これを行うにはマクロは必要ありません。正直なところ、おそらくこれを行う必要はまったくありません-これを使用しているのは、完全にデータステップで実行する方がよい可能性が非常に高いです-しかし、あなたが述べた欲求があれば、これはデータステップで行われます.

data _null_;
do iter = 1 to 82;
call symputx(cats('myvar_',iter),put(iter,metricvar.));
end;
run;

結局のところ、CALL SYMPUT(x) は定数ではなく文字引数を取るので、それを 82 回変更することができます。

于 2013-12-05T15:05:05.267 に答える
1
%macro metric_var;
%let metvar1 = 1;
%let metvar2 = 82;

%do U = &metvar1. %to &metvar2. %by 1;
    %let myvar_&u. = &u;
    %put myvar_&u is: &&myvar_&u;
%end;
%mend;

%metric_var;

魔法が&&myvar_&uかかっています - を取得するための二重のアンプレサンドは、&myvar_1 などのマクロ変数の値として解決されます。myvar がマクロ変数でもある場合は、トリプル ampresand が必要になります&&&myvar_&u

また、データのステップをスキップしました。必要ありません。

于 2013-12-05T13:06:23.633 に答える