2017-02-08 6 views
0

したがって、私はこのマクロを持っています:stab_index(yearmonth,period)Stab_Ind_DYNAMICS一度に異なるパラメータでマクロを複数回実行します

はのは、私は別のマクロを実行するための十分なデータセットを生成するために、この

%stab_index(201601,01/2016); 
%stab_index(201602,02/2016); 
%stab_index(201603,03/2016); 
%stab_index(201604,04/2016); 
%stab_index(201605,05/2016); 

などのさまざまなパラメータを使用して5回(多分もっと)それを実行しなければならないとしましょう。

しかし、結果を得るために6回実行したくないので、毎回パラメータを入力することなく、すべてを一度に実行したいと思います。

誰かが私がこれをどのように設定するかの方向で私を指摘できますか?

ありがとうございます!

+0

%STAB_INDEXの機能の詳細について説明してください。私はあなたが「そうする」ことを望まないと考えることができます。 –

答えて

0

これは、パラメータのリストをループする別のマクロで実現できます。

%let param1 = 201601 201602 201603 201604 201605; 
%let param2 = 01/2016 02/2016 03/2016 04/2016 05/2016; 
%macro loop(); 
    %do i=1 %to %sysfunc(countw(&param1,%str())); 
     %let thisparam1=%scan(&param1,&i,%str()); 
     %let thisparam2=%scan(&param2,&i,%str()); 
     %put &thisparam1 &thisparam2; 
     %stab_index(&thisparam1,&thisparam2); 
    %end; 
%mend loop; 
%loop; 

あなたは最初の(私はここ& PARAM2 PARAM1それらを呼ばれる)のパラメータのあなたのリストを定義する必要があります。

次に、単語の数に1からループし、リストからi番目のパラメータを取得し、stab_indexマクロで使用することができます。

あなたのパラメータにスペースが含まれている念のために、あなたはあなたのリストのためのスペースよりも別のセパレータを使用して、COUNT週間機能(%sysfunc(countw(&param1,'-')))とスキャン機能(%scan(&param1,&i,'-'))で三番目のパラメータで第2引数でそれを定義することができます。

+0

'%sysfunc(countw(&param1)、 '')をコーディングすると、COUNTWは区切り文字として空白と単一引用符の両方を使用するように指示します。引用符はマクロ言語で意味を持たないため、値の一部です。ブランクだけを区切り文字にする必要がある場合は、それを '%sysfunc(countw(&param1)、%str())'としてコーディングします。 – Quentin

+0

@Quentinあなたは正しくあります。 %sysfunc(countw(&param1)、 '') 'ではなく、%sysfunc(countw(&param1、 ''))'を意味します。あなたのコメントは%スキャンにも適用されますか? –

+0

私はあなたのタイプミスをコピーし、それに気づいていませんでしたが、はい、それはマクロ言語全体に適用されます。 '%scan(&param1、&i、 '')'も同様です。マクロ言語では、すべての値がテキストなので、「これはテキスト値です」という意味ではありません。引用符を追加すると、値の一部になります。 – Quentin

1

これは、パラメータ値が常にデータ内に存在することを前提としています。

:あなたは yearmonthperiod(私の uniqueデータセットは以下どのように見えるか)のすべてのユニークな組み合わせまで、あなたのデータセットを得ることができるならば、あなただけのデータが変化するデータを収容することができます仕事をさせ、入力された何もする必要はありません
** create test data **; 
data have0; 
    year = 2016; 
    do i=1 to 12; 
     temp=i; 
     output; 
    end; 
run; 

data have; set have0; 
    temp1 = strip(put(year,best4.))||strip(put(temp,z2.)); 
    yearmonth=intnx('month', input(put(temp1,6.), yymmn6.), 1)-1; 
    period=yearmonth; 
    format yearmonth yymmn6. period mmyys7.; 
run; 

** get data down to every unique combination of yearmonth and period **; 
proc sort data = have out=unique(keep=yearmonth period) nodupkey; 
    by yearmonth period; 
run; 

** create a macro string dynamically using data **; 
data create_macro_string; set unique; 
    macro_str=%nrstr("%stab_index")||"("||strip(put(yearmonth,yymmn6.))||","||strip(put(period,mmyys7.))||");"; 
    keep yearmonth period macro_str; 
run; 

** put all your macros into a list **; 
proc sql noprint; 
    select macro_str 
    into: macro_list separated by " " 
    from create_macro_string; 
quit; 

** call your macros **; 
%put &macro_list.; 
+0

CALL EXECUTEに興味があるかもしれません。 http://support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm –

関連する問題