#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 ;