Using the exact data and code you shared I'm getting a different result. Can you please verify and share sample data that matches your code.
You haven't shared SAS log. Are there any notes in it about character to numeric conversion?
SAS numerical variables can't store non-printable characters. They could store special missings but none of your tests checks for missings where this could hit you.
And just as a thought: IF there is a custom format applied to your variables that prints certain values as missing then you could be misled. To ensure this is not the case add the following line to your data step.
format HLT_ALZDEM cohort_flag best32.;
Here your exact data and code to demonstrate that the outcome is different than what you describe.
data have;
infile datalines dsd dlm=',' truncover;
input Obs HLT_ALZDEM cohort_flag src_MA_group src_TM_group src_ADRD_group src_non_ADRD_group;
datalines;
1,,0,,,,
2,,1,0,1,0,0
3,,1,1,0,,
4,,0,,,,
5,,0,,,,
6,,1,0,1,,
7,,1,1,0,,
8,,1,1,0,,
9,,1,1,0,,
10,,1,1,0,0,0
11,,1,1,0,,
12,,1,0,1,,
13,,1,0,1,,
14,,1,0,1,,
15,,1,0,1,,
16,,1,0,1,0,0
;
run;
data want;
length Obs HLT_ALZDEM cohort_flag
src_MA_group MA_group src_TM_group TM_group
src_ADRD_group ADRD_group src_non_ADRD_group non_ADRD_group
8;
set have;
IF cohort_flag = 1 AND ADM_MA_FLAG_YR = 3
THEN MA_group = 1; ELSE MA_group = 0;
IF cohort_flag = 0 THEN MA_group = .;
IF cohort_flag = 1 AND ADM_FFS_FLAG_YR = 3
THEN TM_group = 1; ELSE TM_group = 0;
IF cohort_flag = 0 THEN TM_group = .;
IF cohort_flag = 1 AND HLT_ALZDEM = 1
THEN ADRD_group = 1; ELSE ADRD_group = 0;
IF cohort_flag = 0 THEN ADRD_group = .;
IF HLT_ALZDEM ^in (1,2) THEN ADRD_group = .;
IF cohort_flag = 1 AND HLT_ALZDEM = 2
THEN non_ADRD_group = 1; ELSE non_ADRD_group = 0;
IF cohort_flag = 0 THEN non_ADRD_group = .;
IF HLT_ALZDEM ^in (1,2) THEN non_ADRD_group = .;
run;
proc print data=want;
run;
And below not changing your logic but ordering the conditions a bit differently so they become easier to read and maintain:
data want;
length Obs HLT_ALZDEM cohort_flag
src_MA_group MA_group src_TM_group TM_group
src_ADRD_group ADRD_group src_non_ADRD_group non_ADRD_group
8;
set have;
IF cohort_flag = 0 THEN MA_group = .;
else IF cohort_flag = 1 AND ADM_MA_FLAG_YR = 3 THEN MA_group = 1;
ELSE MA_group = 0;
IF cohort_flag = 0 THEN TM_group = .;
else IF cohort_flag = 1 AND ADM_FFS_FLAG_YR = 3 THEN TM_group = 1;
ELSE TM_group = 0;
IF HLT_ALZDEM ^in (1,2) THEN ADRD_group = .;
else IF cohort_flag = 0 THEN ADRD_group = .;
else IF cohort_flag = 1 AND HLT_ALZDEM = 1 THEN ADRD_group = 1;
ELSE ADRD_group = 0;
IF HLT_ALZDEM ^in (1,2) THEN non_ADRD_group = .;
else IF cohort_flag = 0 THEN non_ADRD_group = .;
else IF cohort_flag = 1 AND HLT_ALZDEM = 2 THEN non_ADRD_group = 1;
ELSE non_ADRD_group = 0;
run;
... View more