如何在SAS中动态选择索引赋值变量?
How to choose indexed assignment variable dynamically in SAS?
我正在尝试在 SAS DI 中构建自定义转换。此转换将 "act" 输入数据集中的列,产生所需的输出。为简单起见,我们假设转换将使用 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"
并且只使用列result
输出 table).
但是,我在尝试使方法更加动态时遇到了两个问题:
我在包含以下内容的行中收到以下警告
result = myfunc("&&input_col&index")
:
WARNING: Apparent symbolic reference INDEX not resolved.
- 我不知道如何动态分配所需的输出列;即,根据 do 循环的迭代,我想将输出值分配给相应的输出列。
我确信这个问题的解决方案在专家中一定是众所周知的,但我找不到任何解释如何做到这一点的内容。
非常感谢任何帮助!
您不能以这种方式使用依赖于数据变量的宏变量。宏变量在编译时解析,而不是在 运行 时。
所以你要么必须
%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])
,它将变量名称作为字符传递。
我正在尝试在 SAS DI 中构建自定义转换。此转换将 "act" 输入数据集中的列,产生所需的输出。为简单起见,我们假设转换将使用 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"
并且只使用列result
输出 table).
但是,我在尝试使方法更加动态时遇到了两个问题:
我在包含以下内容的行中收到以下警告
result = myfunc("&&input_col&index")
:WARNING: Apparent symbolic reference INDEX not resolved.
- 我不知道如何动态分配所需的输出列;即,根据 do 循环的迭代,我想将输出值分配给相应的输出列。
我确信这个问题的解决方案在专家中一定是众所周知的,但我找不到任何解释如何做到这一点的内容。
非常感谢任何帮助!
您不能以这种方式使用依赖于数据变量的宏变量。宏变量在编译时解析,而不是在 运行 时。
所以你要么必须
%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])
,它将变量名称作为字符传递。