Использовать переменную в качестве шага макропеременных данных
Я ищу способ использовать нормальное значение переменной в качестве макропеременной в шаге данных.
Например, у меня есть макропеременная & 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 может ссылаться на них.
Надеюсь, это поможет.