Существует около десятка способов сделать это, но лучший способ для этого есть, вероятно, сделать формат из второго набора данных.
Форматы - это просто отношения между одним значением и другим значением, и это именно то, что у вас здесь есть! Вы используете опцию CNTLIN в PROC FORMAT, чтобы создать отношение из набора данных (ваш набор данных B), а затем применить его, используя PUT. (Затем используйте INPUT, чтобы вернуться к числу - форматы создают только символьные значения. Вы не можете использовать INFORMAT здесь, потому что они принимают только символьные значения в качестве ввода. Число к номеру всегда делает дополнительный шаг.)
Вы также можете использовать поиск в хеш-таблице, или просто пару шагов слияния данных, или операторы набора ключей ... множество опций, а также соединения SQL. Но форматирование здесь будет самым быстрым и легким для кодирования IMO.
data a;
input Observation Var1 Var2;
datalines;
1 0 0
2 1 2
3 2 1
4 0 0
;;;;
run;
data b;
input Var $ Level Lookup;
datalines;
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
;;;;
run;
*Here we make a new dataset that has the required names for a format cntlin dataset;
data for_fmt;
set b;
rename var=fmtname
level=start
lookup=label
;
var = cats(var,'F'); *format names cannot end with numbers, so add an F at the end;
run;
proc format cntlin=for_fmt; *read in the format;
quit;
*now use the formats;
data want;
set a;
var1_new = input(put(var1,var1f.),best12.);
var2_new = input(put(var2,var2f.),best12.);
run;