SAS присваивает результаты из макрофункции массиву в шаге данных - PullRequest
0 голосов
/ 09 февраля 2012

Этот код берет два макроса и присваивает их массивам внутри шага данных, а затем перебирает каждую переменную, определенную в ln_vars, создавая новую переменную, которая является натуральным логарифмом переменной, добавляя _ln к имени

%let ln_vars = var1 var2;
%let ln_names = %add_string(&ln_vars, _ln);

data transform;
    set analysis;
    array ln &ln_vars;
    array ln_n &ln_names;
    *call execute ('%add_string(%str(&ln_vars), _ln)');

do over ln;
    ln_n = log(ln);
end;

run;

может быть, есть лучшая идиома в коде sas (я надеюсь). Я хочу иметь возможность просто передать один макрос (макрос ln_vars) и вызвать функцию% add_string () внутри шага данных. Прокомментированный call execute возвращает правильную строку, но когда я пытаюсь

1588       array ln_n call execute ('%add_string(%str(&ln_vars), _ln)');
ERROR: Attempt to initialize variable call in numeric array ln_n with character constant
       '%add_string(%str(&ln_vars), _ln)'.

1 Ответ

2 голосов
/ 09 февраля 2012

Было бы полезно, если бы вы дали нам определение макроса% add_string.В любом случае, похоже, что & ln_names должен быть списком переменных, соответствующих списку в & ln_vars, за исключением того, что каждая переменная имеет суффикс '_ln'.

Если я прав, вам на самом деле не нуженМакрос% add_string и может сделать это вместо этого:

%let ln_vars = var1 var2;
%let ln_names = %sysfunc(tranwrd(&ln_vars,%str( ),%str(_ln )))_ln;
%put LN_VARS: &ln_vars;
%put LN_NAMES:&ln_names;

data transform;
  set analysis;
  array ln &ln_vars;
  array ln_n &ln_names;
  do over ln;
    ln_n = log(ln);
  end;
run;

Обратите внимание, что два оператора% put на самом деле не нужны - они просто помещаются туда для проверки значений двух макропеременных


Согласно вашему комментарию, вы можете иметь макрос:

%macro lnvars(vars=,suffix=_ln);

  %let newvars=%sysfunc(tranwrd(&vars,%str( ),%str(&suffix )))&suffix;

  array ln &vars.;
  array ln_n &newvars.;
  do over ln;
    ln_n = log(ln);
  end;

%mend;

и затем вызывать макрос из шага данных следующим образом:

data transform;
  set analysis;
  %lnvars(vars=var1 var2);
run;

(Обратите внимание, я имеюне проверял код, но вы должны получить общее представление)

...