1

あなたが私を助けることができるだろうか

列の値が列のフィールド名でもあるデータセットがあります。列の値を使用して、数式で該当するフィールドを呼び出せるようにしたいと考えています。

たとえば…列があります…</p>

MERCH_NO
V01
M02
V08
M08
AMOUNT
PLAN

レコードは次のようになります…そして、計算フィールドに何をさせたいのか…</p>

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の場合、 V01列の値をCALCフィールドで使用する必要があります。PLANフィールドにM08 と表示されている場合は、M08値を使用する必要があります。約40のプランがあります。

4

2 に答える 2

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 */

OK、PLANフィールドに関するあなたのメモに気付かなかった場合は、必要に応じて調整してください.

于 2013-08-28T14:40:04.043 に答える
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;
于 2013-08-28T14:44:07.140 に答える