SAS: dim и макро переменные - PullRequest
       9

SAS: dim и макро переменные

0 голосов
/ 08 февраля 2019
data example1;
    input var1 var2 var3;
    datalines;
    10 11 14
    3 5 8
    0 1 2
;

data example2;
    input var;
    datalines;
    1
    2
    8
;

Допустим, что количество var переменных зависит от ввода данных.Я хочу поместить это число в макропеременную и использовать на другом шаге данных, например:

%macro m(input);

    data &input.;
        set &input.;

        array var_array[*] var:;

        %let array_dim = dim(var_array);

        do i = 1 to &array_dim;

            var_array[i] = var_array[i] + 1;

        end;

        drop i;

    run;

    data example2;
        set example2;

        var2 = var * &array_dim; /* doesn't work */

    run;

%mend;

%m(example1);

% let array_dim = dim (var_array);не работает на втором шаге данных, потому что dim (var_array) не оценивается, но% eval или% sysevalf при объявлении макропеременной здесь не работают.Как это сделать правильно?

1 Ответ

0 голосов
/ 08 февраля 2019

Вы смешиваете код макроса и код шага данных способом, который не поддерживается в SAS.Если вы хотите присвоить макропеременной значение, которое вы генерируете как часть шага данных, вам нужно использовать call symput.

Кроме того, если вы создаете макро-переменную во время шага данных, вы не можете разрешить ее во время того же шага данных, как вы пытаетесь это сделать (если вы не используете функцию resolve ...),Для этого проще просто использовать переменную набора данных.

Итак, вот фиксированная версия вашего кода, которая, я думаю, вероятно, делает то, что вы хотите:

%macro m(input);

    data &input.;
        set &input.;

        array var_array[*] var:;

        array_dim = dim(var_array);

        /*Only export the macro variable once, for the first row*/
        if _n_ = 1 then call symput('array_dim_mvar', array_dim);

        do i = 1 to array_dim;

            var_array[i] = var_array[i] + 1;

        end;

        drop i;

    run;

    data example2;
        set example2;

        var2 = var * &array_dim_mvar;

    run;

%mend;

%m(example1);
...