DATA Step, Macro, Functions and more

how do i do this with as few steps as possible?

Accepted Solution Solved
Reply
Contributor K_S
Contributor
Posts: 23
Accepted Solution

how do i do this with as few steps as possible?

[ Edited ]

 i have a database that looks like this 

iddiag 1 diag2  diag3diag4diag5diag7diag8diag9
110110000
200000000
300 00 11
4 0000000

 

I need to create a new_var that is equals to 1 if either one of the 'diag's  have a value of 1.

I did it by summing the diags and having the new_var = 1 if sum(diag1-diag24)>=1.

Is there another way to do this without typing a lot? Also, my technique only works if the observantions are 1s and 0s. I could do something like this if my obs values were different than 1 --> diag1=2 or diag2=1 or diag3=5....and so on then new_var=1. This isn't very practical when i have many 'diag's, so how could I do this without typing a lot?


Accepted Solutions
Solution
‎03-10-2017 10:00 AM
Super User
Posts: 5,081

Re: how do i do this with as few steps as possible?

[ Edited ]

Finding only a 1 (not a 2 or a 5) can be done with only mild complications.  The CAT family of functions works on numeric as well as character values.  So you could code:

 

if index(cats(of diag1-diag24), '1') > 0;

 

If your data contains two-digit numbers (so you need to find "1" but not "10"), it can still be done but gets mildly more complex.

View solution in original post


All Replies
PROC Star
Posts: 551

Re: how do i do this with as few steps as possible?

I think your solution is solid, though you would probably type sum(of diag1-diag24)>=1 Smiley Happy

Contributor K_S
Contributor
Posts: 23

Re: how do i do this with as few steps as possible?

good catch! thanks Smiley Wink 

Solution
‎03-10-2017 10:00 AM
Super User
Posts: 5,081

Re: how do i do this with as few steps as possible?

[ Edited ]

Finding only a 1 (not a 2 or a 5) can be done with only mild complications.  The CAT family of functions works on numeric as well as character values.  So you could code:

 

if index(cats(of diag1-diag24), '1') > 0;

 

If your data contains two-digit numbers (so you need to find "1" but not "10"), it can still be done but gets mildly more complex.

Super User
Posts: 10,484

Re: how do i do this with as few steps as possible?

For a very few character shorter typing:

 

new_var = (index(catt(of diagSmiley Happy,'1')>0);

Frequent Contributor
Posts: 117

Re: how do i do this with as few steps as possible?

sum(of diag1-diag9) >=1 OR max(of diag1-diag9) >=1 should work.

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 5 replies
  • 185 views
  • 4 likes
  • 5 in conversation