i have a database that looks like this
id | diag 1 | diag2 | diag3 | diag4 | diag5 | diag7 | diag8 | diag9 |
1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 1 | 1 | ||
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
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?
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.
I think your solution is solid, though you would probably type sum(of diag1-diag24)>=1 🙂
good catch! thanks 😉
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.
For a very few character shorter typing:
new_var = (index(catt(of diag:),'1')>0);
sum(of diag1-diag9) >=1 OR max(of diag1-diag9) >=1 should work.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.