Below another coding option that doesn't use call sortc() and though won't change the values in your source variables.
data have;
infile datalines truncover dsd;
input (var1 var2 var3 var4 RESULT) (:$50.);
datalines;
SD - 03-AUG-2018,SD - 03-AUG-2018,SD - 03-AUG-2018,,Reviewer
NE - 07-SEP-2018,,NE - 07-SEP-2018,,Reviewer
SD - 08-AUG-2019,SD - 08-AUG-2019,SD - 08-AUG-2019,,Reviewer
CR - 12-SEP-2019,SD - 12-SEP-2019,SD - 12-SEP-2019,,Chair
,,,,
,CR - 12-SEP-2019,,NE - 07-SEP-2018,Chair
,NE - 07-SEP-2018,,NE - 07-SEP-2018,Reviewer
,,NE - 07-SEP-2018,,Reviewer,,
CR - 12-SEP-2019,,,NE - 07-SEP-2018,Chair
;
data want(drop=_:);
set have;
length result_derived $8 _first_nonblank $50;
array _a_vars {*} var1 - var4;
_first_nonblank=coalescec(of _a_vars[*]);
if not missing(_first_nonblank) then
do;
result_derived='Reviewer';
do _i=2 to dim(_a_vars);
if not missing(_a_vars[_i]) and _first_nonblank ne _a_vars[_i] then
do;
result_derived='Chair';
leave;
end;
end;
end;
run;
proc print data=want;
run;
Or below a variant of above logic that avoids comparing a value with itself in case the first array element is missing.
data want(drop=_:);
set have;
length result_derived $8;
array _a_vars {*} var1 - var4;
do _i=2 to dim(_a_vars);
if missing(_k) and not missing(_a_vars[_i-1]) then _k=_i-1;
else
if not missing(_k) then
if _a_vars[_k] ne _a_vars[_i] then
do;
result_derived='Chair';
leave;
end;
end;
if missing(result_derived) and not missing(_k) then result_derived='Reviewer';
run;
... View more