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

How to choose indexed assignment variable dynamically in SAS?

我正在尝试在 SAS DI 中构建自定义转换。此转换将 "act" 输入数据集中的列,产生所需的输出。为简单起见,我们假设转换将使用 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" 并且只使用列result 输出 table).

但是,我在尝试使方法更加动态时遇到了两个问题:

我确信这个问题的解决方案在专家中一定是众所周知的,但我找不到任何解释如何做到这一点的内容。

非常感谢任何帮助!

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

所以你要么必须

%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." 传递给它时引用 "&&input_col&index." ,但除非你想要名称,否则这将是一种奇怪的操作方式输入列作为文本(并且不想知道该变量中有什么数据)。如果这样做,则传递 vname(in[i]),它将变量名称作为字符传递。