2

SAS sqlを使用して、後でレポートを使用および印刷するためのマクロ変数を作成しています。

グループごとにいくつかの要約変数(平均、最小、最大など)を作成しています。

次のコードは最初のグループで機能しますが、グループ2と3のマクロ変数は作成しません。


data scores;
  input trt  t;
cards;  
1  10
1  11
1  12
1  13
2  4
2  5
2  6
2  7
3  9
3  8
3  7
3  6
;
run;



%macro cdi;


%do i = 1 %to 3;

proc sql noprint;
  select  n(t),  nmiss(t),  mean(t),  std(t),  min(t),  max(t) 
    into  :n&i,   :miss&i,  :mean&i,   :sd&i,  :min&i,  :max&i

  from scores
  where trt = &i;
quit;

%end;

%mend cdi;
%cdi;

*****  this call shows the right values  ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;


*****  this call produces error (symbolic reference not resolved)  ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;

簡単なものが欠けていると思いますが、まだ見ることができません...

4

3 に答える 3

4

問題は、作成しているマクロ変数がマクロに対してローカルであるということです。マクロの実行後に存在したい場合は、%globalマクロ内のステートメントでそれらを定義する必要があります。

つまり、これをマクロ定義の先頭に追加します。

%global n1 miss1 mean1 sd1 min1 max1 
        n2 miss2 mean2 sd2 min2 max2 
        n3 miss3 mean3 sd3 min3 max3 ;
于 2013-02-07T19:14:58.047 に答える
2

集計値のマクロ変数を作成するのはなぜですか? 後で使用するためにこれをテーブルとして作成する方が良くない用途は本当にほとんどありません...そして、より高速で、はるかにシンプルで、より柔軟です。

proc sql;
create table summary as
select  trt, n(t) as n,  nmiss(t) as nmiss,  mean(t) as mean,  std(t) as std,  min(t) as min,  max(t) as max
from scores
group by trt;
quit;

または、SASにいるので...

proc means data=scores;
var t;
class trt;
types trt;
output out=summary n= nmiss= mean= std= min= max= /autoname;
run;

その後、必要に応じてレポートで使用します。または、それが簡単な場合は、メインのデータセットにマージして戻します。データはデータであるべきであり、マクロ変数はデータではなくプログラム入力であるべきです。

于 2013-02-07T19:34:19.617 に答える
-2

ボブは正しいです。ソリューションはカット アンド ペーストと同じくらい簡単です。

%macro cdi;


%do i = 1 %to 3;

proc sql noprint;
  select  n(t),  nmiss(t),  mean(t),  std(t),  min(t),  max(t) 
    into  :n&i,   :miss&i,  :mean&i,   :sd&i,  :min&i,  :max&i

  from scores
  where trt = &i;
quit;

%end;
*****  this call shows the right values  ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;


*****  this call NO LONGER produces error (symbolic reference not resolved)  ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;

%mend cdi;
%cdi;
于 2013-02-07T19:25:03.903 に答える