代わりにHASHオブジェクトを使用します。最初に、「行列」ではなく通常のデータセットにレートを転記します。または、元々そのように作成してください。
data rates;
do type=1 to 3 ;
do time=1 to 3 ;
input rate @@ ;
output;
end;
end;
cards;
.1 .2 .3 .4 .5 .6 .7 .8 .9
;
ここでは、データの例を示します。私は、レートテーブルのレコードと一致しないレコードを1つ含んでいました。
data have ;
input type time amount expected;
cards;
1 2 100 20
2 3 100 60
4 5 100 .
;
次にHASHオブジェクトに速度をロードし、現在の型および時間の組み合わせのためのレートを見つけるために.FIND()メソッドを使用します。
data want ;
set have ;
if _N_ = 1 then do;
declare hash h(dataset:"rates");
rc = h.defineKey('type','time');
rc = h.defineData('rate');
rc = h.defineDone();
call missing(rate);
drop rc;
end;
if (0=h.find()) then payment=amount*rate;
run;
結果。
Obs type time amount expected payment rate
1 1 2 100 20 20 0.2
2 2 3 100 60 60 0.6
3 4 5 100 . . .
出典
2017-11-22 17:13:12
Tom
60桁の数値はすべて数字ですか?たとえば、3行5列のサンプルデータを投稿するとよいでしょう。 – Quentin
6,000個の変数をすべて配列にロードする理由を教えてください。これは一時的な配列ですか、それともデータセットに格納する予定ですか?ここのユースケースは何ですか?非常に一般的なデータ構造でも、SASで非常に使いやすいものでもない2次元配列よりも、物事を扱う別の方法があるかもしれません。 – Joe
私はいくつかの金額にわたって60の割引率を適用しています。私は現在4種類のディスカウントタイプを持っていますが、それを解決するためのコードを書いていますが、異なるディスカウントタイプと_m_異なるディスカウント期間で一般化する方法を考えることができませんでした。 私は100K以上の金額を持っています。現在価値の計算は、トランザクションのさまざまなコンポーネントに対して複数回実行する必要があります(私は、さまざまなトランザクションコンポーネントを処理する自己生成コードを使用しています)思い出がもっと効率的になるだろう。 – candlejack