BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
TrueTears
Obsidian | Level 7

Say I have the following excerpt dataset:

 

 

data have;
     input year  ID $ shock;
     cards;
     2000  1001  1
     2001  1001  1
     2002  1001  1
     2003  1001  1
     2004  1001  1
     2000  1003  1
     2001  1003  1
     2002  1003  1
     2003  1003  1
     2004  1003  1
     2000  1007  1
     2001  1007  1
     2002  1007  1
     2003  1007  1
     2004  1007  1
     2000  1010  1
     2001  1010  1
     2002  1010  1
     2003  1010  1
     2004  1010  1	 
;
run;

The year is always from 2000 to 2004. Shock always takes a value of 1 in this dataset. Now I have a list of IDs as follows:

 

 

 

data list;
     input  ID;
     cards;
1001
1003
1004
1005
1007
1009
1010 
;
run;

As you can see, ID 1004, 1005, and 1009 are missing from the original dataset. What I wish to do is obtain the following dataset:

 

 

data want;
     input year  ID $ shock;
     cards;
     2000  1001  1
     2001  1001  1
     2002  1001  1
     2003  1001  1
     2004  1001  1
     2000  1003  1
     2001  1003  1
     2002  1003  1
     2003  1003  1
     2004  1003  1
     2000  1004  0
     2001  1004  0
     2002  1004  0
     2003  1004  0
     2004  1004  0
     2000  1005  0
     2001  1005  0
     2002  1005  0
     2003  1005  0
     2004  1005  0
     2000  1007  1
     2001  1007  1
     2002  1007  1
     2003  1007  1
     2004  1007  1
     2000  1009  0
     2001  1009  0
     2002  1009  0
     2003  1009  0
     2004  1009  0
     2000  1010  1
     2001  1010  1
     2002  1010  1
     2003  1010  1
     2004  1010  1	 
;
run;

So that the missing IDs are inserted into the original dataset from year 2000 to 2004 but shock takes a value of 0 for these missing IDs.

 

Thank you.

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
novinosrin
Tourmaline | Level 20


data have;
     input year  ID $ shock;
     cards;
     2000  1001  1
     2001  1001  1
     2002  1001  1
     2003  1001  1
     2004  1001  1
     2000  1003  1
     2001  1003  1
     2002  1003  1
     2003  1003  1
     2004  1003  1
     2000  1007  1
     2001  1007  1
     2002  1007  1
     2003  1007  1
     2004  1007  1
     2000  1010  1
     2001  1010  1
     2002  1010  1
     2003  1010  1
     2004  1010  1
;
run;

data list;
     input  ID $;
     cards;
1001
1003
1004
1005
1007
1009
1010
;
run;


data want;
merge have(in=a) list(in=b);
by id;
if a then output;
else if b then do;
shock=0;
 do year=2000 to 2004;;
 output;
end;
end;
run;

View solution in original post

2 REPLIES 2
PeterClemmensen
Tourmaline | Level 20

One way

 

data have;
     input year  ID $ shock;
     cards;
     2000  1001  1
     2001  1001  1
     2002  1001  1
     2003  1001  1
     2004  1001  1
     2000  1003  1
     2001  1003  1
     2002  1003  1
     2003  1003  1
     2004  1003  1
     2000  1007  1
     2001  1007  1
     2002  1007  1
     2003  1007  1
     2004  1007  1
     2000  1010  1
     2001  1010  1
     2002  1010  1
     2003  1010  1
     2004  1010  1
;
run;

data list;
     input  ID $;
     cards;
1001
1003
1004
1005
1007
1009
1010
;
run;

data want;
   if _N_=1 then do;
      dcl hash h(dataset:'have');
      h.definekey('ID');
      h.definedone();
   end;

   set list;

   do year=2000 to 2004;
      shock=ifn(h.check(), 0, 1);
      output;
   end;
run;

 

Result:

 

ID   year shock 
1001 2000 1 
1001 2001 1 
1001 2002 1 
1001 2003 1 
1001 2004 1 
1003 2000 1 
1003 2001 1 
1003 2002 1 
1003 2003 1 
1003 2004 1 
1004 2000 0 
1004 2001 0 
1004 2002 0 
1004 2003 0 
1004 2004 0 
1005 2000 0 
1005 2001 0 
1005 2002 0 
1005 2003 0 
1005 2004 0 
1007 2000 1 
1007 2001 1 
1007 2002 1 
1007 2003 1 
1007 2004 1 
1009 2000 0 
1009 2001 0 
1009 2002 0 
1009 2003 0 
1009 2004 0 
1010 2000 1 
1010 2001 1 
1010 2002 1 
1010 2003 1 
1010 2004 1 
novinosrin
Tourmaline | Level 20


data have;
     input year  ID $ shock;
     cards;
     2000  1001  1
     2001  1001  1
     2002  1001  1
     2003  1001  1
     2004  1001  1
     2000  1003  1
     2001  1003  1
     2002  1003  1
     2003  1003  1
     2004  1003  1
     2000  1007  1
     2001  1007  1
     2002  1007  1
     2003  1007  1
     2004  1007  1
     2000  1010  1
     2001  1010  1
     2002  1010  1
     2003  1010  1
     2004  1010  1
;
run;

data list;
     input  ID $;
     cards;
1001
1003
1004
1005
1007
1009
1010
;
run;


data want;
merge have(in=a) list(in=b);
by id;
if a then output;
else if b then do;
shock=0;
 do year=2000 to 2004;;
 output;
end;
end;
run;
How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 852 views
  • 0 likes
  • 3 in conversation