Я не уверен на 100%, соответствует ли это поведение тому, как выглядят ваши данные, когда вы импортируете их из Excel, но если я запускаю ваш код для создания have
, я получаю:
NOTE: Invalid data for Base_rate_new in line 145 7-13.
RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+--
145 FIX L Average Maturity
Fixed_or_Floating=FIX asset_or_liability=L Base_rate_new=. _ERROR_=1 _N_=2
NOTE: Invalid data for Base_rate_new in line 147 7-13.
147 FLT L Average Maturity
Fixed_or_Floating=FLT asset_or_liability=L Base_rate_new=. _ERROR_=1 _N_=4
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.HAVE has 4 observations and 3 variables.
По сути, это говорит о том, что когда вы пытались импортировать строки символов как числовые, они не могли этого сделать, поэтому оставляли их как нулевые значения. Если мы распечатываем таблицу, мы можем видеть нулевые значения:
proc print data=have;
run;
Результат:
Fixed_or_ asset_or_ Base_
Floating liability rate_new
FIX A 10
FIX L .
FLT A 20
FLT L .
Предполагая, что именно так выглядят ваши данные, мы можем использовать функцию объединения для достижения вашей цели.
data have3 (drop = base_rate);
merge have2 (in = a)
have (in = b);
by fixed_or_floating asset_or_liability;
base_rate_new = coalesce(base_rate_new,base_rate);
run;
Результат выполнения этого дает нам эту таблицу:
Fixed_or_ asset_or_ Base_
ID Floating liability rate_new
1 FIX A 10
3 FIX A 10
2 FIX L 20
7 FIX L 20
4 FLT A 20
6 FLT A 20
5 FLT L 30
Функция coalesce в основном возвращает первое ненулевое значение, которое она может найти в передаваемых ей параметрах. Поэтому, когда base_rate_new
уже имеет значение, оно использует его, а если нет, то вместо него используется поле base_rate
.