Использовать переменную в качестве шага макропеременных данных

Я ищу способ использовать нормальное значение переменной в качестве макропеременной в шаге данных.

Например, у меня есть макропеременная & statesList_Syphilis = AAA
и еще одна макропеременная & statesList_Giardia = BBB

И в шаге данных у меня есть переменная Germ, которая содержит 2 строки: "Сифилис" и "Giardia".

В моем шаге данных мне нужно найти AAA при итерации по первой строке, когда Germ="Syphilis"
и BBB при итерации по второму ряду, когда Germ="Giardia"

попытка будет выглядеть так

%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;

Я не думаю, что это возможно, но я решил спросить, чтобы быть уверенным.

Спасибо!


РЕДАКТИРОВАТЬ (Следуя вопросам в комментариях, я добавляю контекст к своей конкретной проблеме, но я чувствую, что это усложняет ситуацию):

Это была попытка упростить проблему.

На самом деле AAA и BBB - это длинные списки таких слов, как

"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

В выходной набор данных будут добавлены переменные, содержащиеся в строке, определенной макропеременной, которая зависит от зародыша.

например, для V_HBV будут созданы следующие переменные: бессимптомный_1 фульминант_1 хронический_1 хронический_1 фатальныйФульминант_1 гепатоцеллюлярный_1 компенсированный_1 гепатоцеллюлярный_2 декомпенсированный_1 фатальный Hepatocellular_1 фатальный Hepatocellular_2 фатальный Decompensated_1

1 ответ

Я не слежу за общей картиной, но одна из предыдущих итераций вашего вопроса содержала некоторый код (псевдокод), который иллюстрирует возможную путаницу в отношении того, как работает язык макросов. Рассмотрим этот шаг:

data _null_;
  germ="Syph";  
  call symput('germ',germ);
  %let Germ=%sysfunc(cats(germ));
  put "germ = &germ";
run;
%put &germ;

Журнал выполнения этого в новом сеансе SAS показывает:

1    data _null_;
2      germ="Syph";
3      call symput('germ',germ);
4      %let Germ=%sysfunc(cats(germ));
5      put "germ = &germ";
6    run;

germ = germ

7    %put &germ;
Syph

Теперь поговорим о том, что происходит. Я буду использовать номера строк из журнала.

Строка 2 присваивает текстовую строку Syph переменной данных шага germ. Ничего особенного.

Строка 3 создает макропеременную с именем Germ и присваивает значение переменной зародыша шага данных. Поэтому он присваивает ему значение Syph. Этот оператор CALL SYMPUT выполняется при выполнении шага данных.

Строка 4 - это макрос%let. Он создает макропеременную с именем Germ и присваивает ей значение germ. Поскольку это макрос, он выполняется до выполнения любого кода DATA STEP. Он не знает о переменных шага данных. Строка 4 эквивалентна%let Germ=germ. Для макроязыка правая часть - это зачаток строки из четырех символов. Это не имя переменной шага данных. %syfunc(cats()) ничего не делает, потому что нет списка элементов для объединения.

Строка 5 представляет собой оператор PUT шага данных. Ссылка на макрос и зародыш разрешается во время компиляции шага данных. В этот момент макрос-переменная germ преобразуется в Germ, потому что оператор%LET выполнен (оператор CALL SYMPUT еще не выполнен).

Строка 7 - это оператор%PUT, который выполняется после завершения шага DATA NULL (и после того, как CALL SYMPUT записал значение Syph в макрос-переменную Germ).

Как правило, трудно (и необычно) иметь один шаг данных, на котором вы используете данные для создания макропеременной (например, через symppt вызова) и используете эту макропеременную на том же шаге (т.е. ссылаетесь на макропеременную).). Ссылки на макросы разрешаются до выполнения любого кода шага данных.

Обычно, если ваши данные уже находятся в наборе данных, вы можете получить то, что хотите, с помощью операторов шага данных (циклы DO, а не%DO циклы и т. Д.). Или же вы можете использовать один шаг DATA для генерации ваших макропеременных, а второй шаг DATA может ссылаться на них.

Надеюсь, это поможет.

Другие вопросы по тегам