2016-07-11 4 views
1

変数のリストを生成しようとしましたが、その名前はマクロに格納されています& varsnew。これらの変数の1番目(2番目、3番目など)の値は、別のマクロのリスト(& varsoldに格納されている)の別のリストの1番目(2番目、3番目など) & varsoldが欠けていないか、または(b)&の変数が存在しない場合は0です。coalesceはsasマクロでは機能しませんか?

次のコードは、&変数に変数を定義するためにif-then節を使用する場合にうまく機能します。私は以下のように、& varsnewで変数を定義するためにCOALESCE関数を使用する場合

%macro coal; 
    data DS; 
    set DS; 
    %do i=1 %to %sysfunc(countw(&varsold.)); 
    if %scan(&varsold.,&i.)<=.z then %scan(&varsnew.,&i.)=0 ; 
    else %scan(&varsnew.,&i.)=%scan(&varsold.,&i.); 
    %end; 
    run; 
%mend; 

%coal; 

しかし、その後、コードは動作しません。私は困惑している。

%macro coal; 
    data DS; 
    set DS; 
    %do i=1 %to %sysfunc(countw(&varsold.)); 
    %scan(&varsnew.,&i.)= %sysfunc(coalesce(%scan(&varsold.,&i.),0)); 
    %end; 
    run; 
%mend; 

%coal; 
+0

「動作しない」とはどういう意味ですか? – superfluous

+0

エラー:%SYSFUNCまたは%QSYSFUNCマクロ関数によって参照される関数COALESCEの引数1が数値ではありません。 – Jay

+1

文字値を使うときには 'COALESCEC()'を使う必要があります。 '%SCAN()'関数は数値ではなく変数名を返します。 – Tom

答えて

3

あなたの2つのループは2つの異なることをしています。最初のものは、データセット変数が欠落しているかどうかをチェックし、2番目は変数名のリストが同じ数のエントリを持っているかどうかをチェックします。 MPRINTオプションをオンにすると、マクロが生成しているSASコードを確認できます。おそらく、代わりにこれをしたい

NEW1=OLD1; 
NEW2=OLD2; 
NEW3=0; 

:秒1のようなコードを生成します

if OLD1<= .Z then NEW1=0; ELSE NEW1=OLD1; 

最初の1のようなコードを生成します。

%do i=1 %to %sysfunc(countw(&varsold)); 
    %scan(&varsnew,&i)=coalesce(%scan(&varsold,&i),0); 
%end; 

それとも

%do i=1 %to %sysfunc(countw(&varsold)); 
    %scan(&varsnew,&i)=sum(%scan(&varsold,&i),0); 
%end; 

それとも、より良いマクロのロジックを忘れて、単純なSASステートメントを使用して全体のことを書きます。

array _new &varsnew ; 
array _old &varsold ; 
do i=1 to dim(_new); 
    _new(i)=sum(_old(i),0); 
end; 
関連する問題