Try using a double DoW Loop.
It assumes your data set is sorted by sampCode
.
data want;
_keep=1;
do _n_=1 by 1 until (last.sampCode);
set have;
by sampCode;
if 2*res>max then _keep=0;
end;
do _n_=1 by 1 until (last.sampCode);
set have;
by sampCode;
if _keep=1 then output;
end;
drop _keep;
run;
As a result, 2014_AT14012534-001
and 2014_AT14044069-001
are removed.
sampCode res max
2014_AT14036758-001 0.01 0.066
2014_AT14051994-001 0.01 0.021
2014_BE2549-14-0021 0.01 0.33
2014_BE2549-14-0023 0.01 0.06
2014_BE3013-14-0118 0.01 0.044
2014_BE3259-14-0019 0.01 0.1
2014_BE3259-14-0101 0.01 0.037
2014_BE3320-14-0200 0.01 0.038
2014_BE3365-14-0005 0.01 0.021
2014_BE4040-14-0548 0.005 0.11
2014_BE4685-14-0018 0.01 0.054
2014_BE4804-14-0057 0.01 0.18
2014_BE4824-14-0007 0.01 0.03
For an SQL approach, try
proc sql;
create table want as
select sampCode, res, max
from (select sampCode, res, max,
max(case when 2*res>max then 1 else 0 end) as _max
from have
group by sampCode
having _max=0);
quit;