BookmarkSubscribeRSS Feed
SM1
Obsidian | Level 7 SM1
Obsidian | Level 7

Hi everyone,

 

I am working with personnel records for more than 3 million people over a 30 year period of time. The records are formatted as 1 event per person per row, so some people have as few as 3 or 4 rows, while other people have as many as 120+ rows. There are 108 variables.

 

SSN is used for BY-group processing, along with EVENT_DATE. 

 

EVENT_CODE is used to differentiate between the different possible events. 

 

I want to create a flag variable for every accession event (EVENT_CODE = 101, 102, 103, 104, and 105). Some people have multiple accession events and they may even have multiple accessions into the same organization. 

 

sample data:

 

SSN               EVENT_DATE             EVENT_CODE

123                06/13/2006                   105

123                10/06/2013                   101

123                01/10/2014                   101

456                01/29/2005                   102

456                02/02/2006                   105

 

Using the following syntax, records for person "456" are properly coded - because the person has only a single event per EVENT_CODE values '102' and '105'.

 

But with person "123", only the 1st and 3rd events are properly coded - the 2nd event (or the 1st time EVENT_CODE = 101) gets coded as missing.

 

data accession_loop;

 

*pass one through by-group: determine relative location of each accession record;

do obs=1 by 1 until (last.ssn);

set personnel;

by ssn event_date;

 

*does member have multiple accession events?;

if event_code eq 101 then org1obs = obs;

if event_code eq 102 then org2obs = obs;

if event_code eq 103 then org3obs = obs;

if event_code eq 104 then org4obs = obs;

if event_code eq 105 then org5bs = obs;

end;

 

do obs=1 by 1 until (last.ssn);

set personnel;

by ssn event_date;

 

*now create a single flag variable 'ACCESSION' to indicate any accession event;

if obs = org1obs or obs = org2obs or obs = org3obs or obs = org4obs or obs = org5obs then do;

accession = 1;

end;

else accession = '';

 

output;

end;

run;

 

I think that the problem is that the loop counter (OBS) is only identifying 1 record per possible EVENT_CODE value per person.

 

Is there a way to have the loop counter (OBS) identify every occurrence of EVENT_CODE that meets the relevant criteria?

 

Thanks

3 REPLIES 3
ballardw
Super User

Please show what the desired output for the given input should be. I am not sure I am interpretting your statements as you intend.

SM1
Obsidian | Level 7 SM1
Obsidian | Level 7

 

Sure. Here's the output I currently get when I run the syntax.

 

"Accession_Loop" table created (with new variable ACCESSION)

 

SSN               EVENT_DATE             EVENT_CODE     ACCESSION

123                06/13/2006                   105                        1

123                10/06/2013                   101                        .

123                01/10/2014                   10​1                        1

456                01/29/2005                   102                        1

456                02/02/2006                   105                        1

 

 

Here's the output I want to get.

 

SSN               EVENT_DATE             EVENT_CODE     ACCESSION

123                06/13/2006                   105                        1

123                10/06/2013                   101                        1*****

123                01/10/2014                   10​1                        1

456                01/29/2005                   102                        1

456                02/02/2006                   105                        1

 

Right now, the loop counter only remembers the record number for 1 EVENT_CODE = 101 for person 123, so in my current output, the accession event on 10/06/2013 is coded as missing. I want every record with EVENT_CODE = 101 for person 123 to be remembered so that every event can be coded '1' in ACCESSION.

 

Thanks!

 

 

 

 

 

Astounding
PROC Star

Your objective isn't 100% clear, since we have no examples of codes that are not 101 through 105.  Why would this program produce the wrong result?

 

data want;

set have;

if event_code in (101, 102, 103, 104, 105) then accession=1;

run;

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

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
  • 3 replies
  • 1193 views
  • 0 likes
  • 3 in conversation