如何在SAS中动态选择索引赋值变量?

时间:2017-07-06 18:00:06

标签: sas sas-macro

我正在尝试在SAS DI中构建自定义转换。这种转变将会“行动”。在输入数据集中的列上,生成所需的输出。为简单起见,我们假设转换将使用input_col1来计算output_col1input_col2来计算output_col2,依此类推,直到某些指定数量的列来进行操作在(让我们说2)。

在自定义转换的代码选项部分,用户可以指定(通过提示)要执行的列的名称;例如,用户可以指定input_col1应该引用名为" order_datetime"的列。在输入数据集中,并为input_col2制定类似的规范,否则将该提示留空。

以下是我用于生成自定义转换输出的代码:

data cust_trans;
    set &_INPUT0;

    i=1;
    do while(i<3);
        call symputx('index',i);
        result = myfunc("&&input_col&index");
        output_col&index = result; /*what is proper syntax here?*/
        i = i+1;
    end;
run;

这里myfunc指的是我使用proc fcmp制作的自定义函数,效果很好。

如果我不尝试考虑要操作的可变数量的输入列(例如,如果我使用"&&input_col&i"而不是"&&input_col&index"并且只使用列{{},则自定义转换可以正常工作1}}在输出表上。)

但是,我尝试使方法更具动态性有两个问题:

  • 我在包含的行上收到以下警告 result

      

    警告:未解析显式符号引用INDEX。

  • 我不知道如何动态地分配所需的输出列;即,根据do循环的迭代,我想将输出值分配给相应的输出列。

我确信解决方案必须在专家中众所周知,但我找不到任何解释如何做到这一点。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您不能以这种方式使用依赖于数据变量的宏变量。宏变量在编译时解析,而不是在运行时解析。

所以你要么

%do i = 1 %to .. ;

如果您在宏中(它不能在实际宏之外工作),或者您需要使用数组,这很好。

data cust_trans;
    set &_INPUT0;
    array in[2] &input_col1 &input_col2;  *or however you determine the input columns;
    array output_col[2]; *automatically names the results;
    do i = 1 to dim(in);
        result = myfunc(in[i]); *You quote the input - I cannot see what your function is doing, but it is probably wrong to do so;
        output_col[i] = result; /*what is proper syntax here?*/
    end;
run;

这就是你通常这样做的方式。我不知道myfunc做了什么,我也不知道为什么你把"&&input_col&index."传递给它时会引用它,但这是一种奇怪的操作方式,除非你想要名字输入列为文本(并且不想知道该变量中的数据)。如果这样做,则传递vname(in[i]),它将变量名称作为字符传递。