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.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
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.