0

データ ステップで通常の変数値をマクロ変数として使用する方法を探しています。

たとえば、マクロ変数 &statesList_Syphilis = AAA
と別のマクロ変数 &statesList_Giardia = BBBがあります。

そして、データステップには、「梅毒」と「ジアルジア」の2行を含む変数Germがあります。

私のデータステップでは、Germ="Syphilis" の場合に最初の行を反復するときにAAAを見つけ、Germ="Giardia" の場合に 2 番目の行を反復するときに
BBBを見つける必要があります。

試みはこのようになります

%let statesList_Syphilis = AAA;
%let statesList_Giardia = BBB;

data test;
    set mytablewithgerms; * contains variable Germ ;

    * use germ and store it in &germ macro variable ;
    * something like  %let germ = germ; or call symput ('germ',germ);

    * I want to be able to do this;
    xxx = "&&statesList_&germ"; * would give xxx = "AAA" or xxx = "BBB";

    * or this;
    &&statesList_&germ = "test"; * would give AAA = "test" or BBB = "test";

    run;

無理だと思いますが、念のため質問させていただきます。

ありがとう!


編集(コメントの質問に続いて、特定の問題にコンテキストを追加していますが、これにより事態がより複雑になっていると感じています):

これは、問題を単純化するための試みでした。

実際には、 AAABBBは次のような単語の長いリストです。

"asymptomatic_1 fulminant_1 chronic_1 chronic_1 fatalFulminant_1 hepatocellular_1 compensated_1 hepatocellular_2 decompensated_1 fatalHepatocellular_1 fatalHepatocellular_2 fatalDecompensated_1"

そして、この長い文字列を変数に格納したくありません。この文字列の各単語を do ループで次のように繰り返します。

    %do k=1 %to %sysfunc(countw(&&statesList_&germ));
        %let state = %scan(&&statesList_&germ, &k);
        * some other code here ;
    %end;

EDIT2:
ここに私の問題のより完全なビューがあります:

%macro dummy();

data DALY1;
    * set lengths ;
    length Germ $10 Category1 $50 Category2 $50 AgeGroupDALY $10 Gender $2 value 8 stateList$999;

    * make link to hash table ;
    if _n_=1 then do;

        *modelvalues ----------------;
        declare hash h1(dataset:'modelData');
        h1.definekey ('Germ', 'Category1', 'Category2', 'AgeGroupDALY', 'Gender') ;
        h1.definedata('Value');
        h1.definedone();
        call missing(Germ, Value, Category1, Category2);
        * e.g.
          rc=h1.find(KEY:Germ, KEY:"ssssssssss", KEY:"ppppppppppp", KEY:AgeGroupDALY, KEY:Gender);

        *states ---------------------;
        declare hash h2(dataset:'states');
        h2.definekey ('Germ') ;
        h2.definedata('stateList');
        h2.definedone();

    end;

    set DALY_agregate;

    put "°°°°° _n_=" _n_;

    DALY=0; * addition of terms ;



    rc2=h2.find(KEY:Germ); * this creates the variable statesList;

    put "statesList =" statesList;

    * here i need statesList as a macro variable,;

    %do k=1 %to %sysfunc(countw(&statesList)); *e.g. acute_1 asymptomatic_1 ...;
        %let state = %scan(&statesList, &k);
        put "=== &k &state";
        &state = 1; * multiplication of terms ;

        * more code here;
    %end;


run;
%mend dummy;
%dummy;

EDIT3:
入力データセットは次のようになります

Germ    AgeGroup1 AgeGroup2 Gender Cases    Year
V_HBV   15-19   15-19   M   12  2015
V_HBV   15-19   15-19   M   8   2016
V_HBV   20-24   20-24   F   37  2011
V_HBV   20-24   20-24   F   46  2012
V_HBV   20-24   20-24   F   66  2013

出力データセットは、Germ に依存するマクロ変数によって定義された文字列に含まれる変数を追加します。

たとえば、V_HBV の場合、次の変数が作成されます。

4

1 に答える 1