Заполнитель SAS - PullRequest
       30

Заполнитель SAS

0 голосов
/ 26 апреля 2018

Мне нужна гибкая структура импорта в мой код SAS. Таблица импорта из Excel выглядит следующим образом:

data have;
input Fixed_or_Floating $ asset_or_liability $ Base_rate_new;
datalines;

FIX A 10
FIX L Average Maturity
FLT A 20
FLT L Average Maturity
;
run;

Исходный набор данных, с которым я работаю, выглядит следующим образом:

data have2;
input ID Fixed_or_Floating $ asset_or_liability $ Base_rate;
datalines;

1 FIX A 10
2 FIX L 20
3 FIX A 30
4 FLT A 40
5 FLT L 30
6 FLT A 20
7 FIX L 10
;
run;

Заполнитель "Средний срок погашения" существует в файле excel только в том случае, если новая процентная ставка определяется средним сроком погашения облигации. У меня есть отдельная функция для этого, которая позволяет мне искать и затем присоединяться к новой базовой ставке в зависимости от ближайшей процентной ставки. Примером этого является то, что если срок погашения облигации составляет 10 лет, я буду использовать 10-летнюю процентную ставку.

Итак, мой вопрос, как я могу выполнить простое слияние, используя код, подобный следующему:

proc sort data = have;
by fixed_or_floating asset_or_liability;
run;

proc sort data = have2;
by fixed_or_floating asset_or_liability;
run;

data have3 (drop = base_rate);
merge have2 (in = a)
      have1 (in = b);
by fixed_or_floating asset_or_liability;

run;

Проблема на данный момент в том, что мое значение-заполнитель не читается, и мне нужно, чтобы оно было словом, так как Excel работает в своей справочной таблице - тогда я использую оператор if, такой как

if base_rate_new = "Average Maturity" then do;

(Insert existing Function Here)

end;

так что просто импортируйте Excel с функцией заполнителя, пожалуйста и спасибо.

ТИА.

1 Ответ

0 голосов
/ 26 апреля 2018

Я не уверен на 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.

...