Hi @atbeczkiewicz,
There's another risk in code like yours which combines merging and recoding: If the merge is not 1:1, observations with duplicate key values might be recoded twice, leading to exactly the effect you've observed, i.e., the recoding changes 0 → 2 → 1.
Simplified example (based on your code):
data micro;
input estid collectdt r301 r400 r550;
cards;
1 20000 . 0 5
;
data hist;
input estid collectdt histvar $;
cards;
1 20000 A
1 20000 B
;
data insp_wrong;
merge micro hist;
by estid collectdt;
array dcharr(*) r301--r550;
do i = 1 to dim(dcharr);
if dcharr(i) > 0 then dcharr(i) = 1; else
if dcharr(i) = 0 then dcharr(i) = 2; else
dcharr(i) = .;
end;
drop i;
run;
Result:
Obs estid collectdt r301 r400 r550 histvar
1 1 20000 . 2 1 A
2 1 20000 . 1 1 B
Safest solution in this situation: Separate the MERGE step from the recoding step, i.e., the recoding step will use a SET statement reading the dataset created in the preceding MERGE step. Of course, you need to make sure that observations with duplicate key values (estid collectdt) are handled correctly according to the requirements.
... View more