Hi,
I am still struggling with some SAS codes, i would really appreciate some help here.
I need to create two dummy variables (d1 and d2) as follows:
d1 = observations that are within 01/03/2001 - 30/11/2001, (otherwise = 0)
d2 = observations that are within 01/12/2007 - 30/06/2009, (otherwise = 0)
(Note: date format: mm/dd/year)
My new model would be (with the dummy variables):
Y = X0 + a1d1 + a2d2 + b1X1 + b2X2 + U
See my sample data below:
| Date | X1 | X2 | 
| 1/2/2001 | 22 | 78 | 
| 2/5/2001 | 34 | 75 | 
| 4/6/2001 | 65 | 65 | 
| 5/7/2001 | 11 | 30 | 
| 6/8/2001 | 56 | 58 | 
| 10/11/2001 | 31 | 29 | 
| 12/12/2001 | 91 | 56 | 
| 1/13/2004 | 49 | 45 | 
| 7/18/2007 | 56 | 41 | 
| 9/19/2007 | 21 | 44 | 
| 12/2/2007 | 67 | 12 | 
| 12/21/2007 | 34 | 41 | 
| 12/29/2007 | 67 | 70 | 
| 1/23/2008 | 90 | 34 | 
| 7/14/2008 | 78 | 65 | 
| 9/25/2008 | 45 | 11 | 
| 6/28/2009 | 45 | 56 | 
| 1/29/2010 | 54 | 31 | 
I tried this code (which is obviously not right):
Data DVs;
set ABC;
array monthdummy(*) 032001 - 062009;
do i=3/1/2001 to 11/30/2001;
do ii=12/1/2007 to 06/30/2009;
if datamonth = i then monthdummy{i} = 1;
if datamonth = ii then monthdummy{ii} = 2;
else monthdummy{i} = 0;
else monthdummy{ii} = 0;
run;
Please help.
Your dates are ddmmyy unless you have 30 months somehow?
d1 = observations that are within 01/03/2001 - 30/11/2001, (otherwise = 0)
d2 = observations that are within 01/12/2007 - 30/06/2009, (otherwise = 0)
(Note: date format: mm/dd/year)
Here's an example of how this could be done.
data want;
set have;
if '01Mar2001'd <= date <= '30Nov2001'd then d1=1;
else d1=0;
run;You can specify date values as 'DDMONYYYY'd with the D at the end. It must be in the DATE9 format as I've demonstrated.
As long as your variable is a date, regardless of format shown, it should work. 
If it's a datetime or character you'll need to first convert it to a date variable.
Your dates are ddmmyy unless you have 30 months somehow?
d1 = observations that are within 01/03/2001 - 30/11/2001, (otherwise = 0)
d2 = observations that are within 01/12/2007 - 30/06/2009, (otherwise = 0)
(Note: date format: mm/dd/year)
Here's an example of how this could be done.
data want;
set have;
if '01Mar2001'd <= date <= '30Nov2001'd then d1=1;
else d1=0;
run;You can specify date values as 'DDMONYYYY'd with the D at the end. It must be in the DATE9 format as I've demonstrated.
As long as your variable is a date, regardless of format shown, it should work. 
If it's a datetime or character you'll need to first convert it to a date variable.
Thank you, Reeza. This worked out well.
Or go binary
data have;
input Date :mmddyy10.	X1	X2;
format Date :mmddyy10.;
datalines;
1/2/2001	22	78
2/5/2001	34	75
4/6/2001	65	65
5/7/2001	11	30
6/8/2001	56	58
10/11/2001	31	29
12/12/2001	91	56
1/13/2004	49	45
7/18/2007	56	41
9/19/2007	21	44
12/2/2007	67	12
12/21/2007	34	41
12/29/2007	67	70
1/23/2008	90	34
7/14/2008	78	65
9/25/2008	45	11
6/28/2009	45	56
1/29/2010	54	31
;
data want;
set have;
d1='01Mar2001'd <= date <= '30Nov2001'd;
run;Thank you, Novinosrin. This was helpful too!
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.
