使用字段值作为sas中的变量

时间:2013-08-28 13:29:09

标签: sas

想知道你是否可以帮助我

我有一个数据集,其中列中的值也是列的字段名称。我希望能够使用列的值来调用公式中的适用字段。

例如......我有专栏......

MERCH_NO
V01
M02
V08
M08
AMOUNT
PLAN

记录看起来像这样......以及我希望calc字段做什么......

MERCH_NO      V01   M02  V08  M08  AMOUNT    PLAN    CALC
123456        2     2    1    1    100.00    V01     value of V01 * AMOUNT
456789        4     4    4    4    250.00    M08     value of M08 * AMOUNT

如果记录的 PLAN 字段显示 V01 ,则必须在 CALC中使用 V01 列的值字段。如果 PLAN 字段显示 M08 ,则应使用 M08 值。大约有40个计划。

2 个答案:

答案 0 :(得分:1)

如何使用VVALUEX()函数的静态示例。

data result;
V01 = 2;
AMOUNT=100;
CALC = 'value of V01 * AMOUNT';
length arg1 arg2 $32;
arg1 = scan(compress(CALC, 'value of'), 1);
arg2 = scan(compress(CALC, 'value of'), 2);
put arg1 arg2;
result = input(VVALUEX(arg1), 16.) * input(VVALUEX(arg2), 16.);
run;

根据您的情况,您必须创建逻辑来识别所有已知的CALC模式,变量的类型和格式(因为VVALUEX()返回格式化的值)。

动态方法但可能不适合大量数据是为每一行生成代码(见下文)。 目前假设一个简单的表达式可用于IF .. THEN

data input;
length CALC  $50;
input V01 M08 AMOUNT  CALC 9-58;
cards;
2 1 100 value of V01 * AMOUNT
2 4 100 value of M08 * AMOUNT
;
run;

/* code generation */
data _null_;
file 'mycalc.sas';
set input end=last;

length line $150;
if _N_=1 then do;
    put 'data result;';
    put '   set input;';
end;
line = 'if _N_ = ' || put(_N_, 8. -L) || 
         ' then RESULT = ' || compress(CALC, 'value of') || ';';
put line;
if last then put 'run;';
run;

%include 'mycalc.sas'; /* run the code */

好的,现在如果看到我没注意到关于PLAN字段的说明 - 请根据需要进行调整。

答案 1 :(得分:0)

Vasja的方法是正确的 - 这是使用您描述的PLAN变量的方法。

data have;
input MERCH_NO      V01   M02  V08  M08  AMOUNT    PLAN $;
calc = input(vvaluex(plan),best12.) * amount;
put calc=;
datalines;
123456        2     2    1    1    100.00    V01     
456789        4     4    4    4    250.00    M08    
;;;;
run;