【问题标题】:SAS: dim and macro variablesSAS:暗淡和宏变量
【发布时间】:2023-03-20 11:22:01
【问题描述】:
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 在这里不起作用。如何正确地做到这一点?

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    您正在以 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多