создайте флаг для каждого месяца, когда политика активна

#sas #sas-macro

Вопрос:

У меня есть набор данных с датой начала политики в период с 2018-01-01 по 2019-12-31 (2 года), который содержит следующую информацию:

 policy          policy_beg_date    policy_end_date
a                 01-01-2018         06-02-2018
b                 04-02-2019         02-04-2020
c                 23-12-2019         03-02-2020
d                 02-02-2019    
 

дата начала политики (дата начала политики) и дата окончания политики (дата окончания политики — отсутствует, если политика все еще активна)

Я хотел бы создать флаги 13 месяцев (флаг_0 месяцев, флаг_1 месяц,….флаг_13 месяцев), где я даю 1, если политика активна в месяце 0, месяце 1 и так далее…. где месяц 0-это месяц начала, месяц 1-это месяц начала 1 и так далее, поэтому у меня было бы что-то вроде этого:

 policy          policy_beg_date    policy_end_date  month_begining   month_end  act_month0  act_month1  act_month2
a               01-01-2018           06-01-2018       201801          201801       1              
b               04-02-2019           02-04-2020       201902          202003       1              1          1
c               23-12-2019           03-02-2020       201912          202002       1              1          1
d               02-02-2019                            201902                       1              1          1
 

Кто-нибудь может, пожалуйста, помочь мне в этом?

Я уже пробовал что-то подобное в этом посте : https://communities.sas.com/t5/SAS-Programming/How-to-create-a-flag-for-each-month-lying-between-2-d… но я получаю ошибки и думаю, что это не то, что мне нужно.

Спасибо!!

Ответ №1:

 data have ;
  infile cards truncover ;
  input policy : $1. policy_beg_date : ddmmyy10. policy_end_date : ddmmyy10. ;
  format policy_beg_date policy_end_date date9. ;
datalines ;
a 01-01-2018 06-02-2018
b 04-02-2019 02-04-2020
c 23-12-2019 03-02-2020
d 02-02-2019    
e 01-01-2020 31-01-2020
;
run;

data want ;
  set have ;
  /* use intck() to get # months */  
  months = intck('month',policy_beg_date,min(policy_end_date,date())) ;
  
  /* array to hold the flags */
  array act{0:13} act_month0-act_month13 ;

  /* loop from 0 to months, set the array flags */
  do mn = 0 to min(months,hbound(act)) ;
    act{mn} = 1 ;
  end ;
run ;

proc print noobs ; run ;
 

Результаты