我正在尝试在SAS DI中构建自定义转换。这种转变将会“行动”。在输入数据集中的列上,生成所需的输出。为简单起见,我们假设转换将使用input_col1
来计算output_col1
,input_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。
我确信解决方案必须在专家中众所周知,但我找不到任何解释如何做到这一点。
非常感谢任何帮助!
答案 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])
,它将变量名称作为字符传递。