Это мое решение:
data vec1;
set ds2;
array cvar{*} col4 col5 col6;
do ijk=1 to dim(cvar);
compvar=cvar(ijk);
output;
end;
run;
proc sql noprint;
select distinct compvar into :cvars separated by ' '
from vec1;
quit;
%let numcvar=&sqlobs;
data ds1(drop=i);
set ds1;
array myvar(i) col:;
do over myvar;
if myvar in (&cvars.) then delete;
end;
run;
Если у вас возникнут проблемы с длиной макропеременной CVARS, вы можете использовать это вместо:
data vec1;
set ds2;
array cvar{*} col:;
do ijk=1 to dim(cvar);
compvar=cvar(ijk);
output;
end;
run;
proc sort data=vec1 out=vec2(keep=compvar) nodupkey;
by compvar;
run;
proc transpose data=vec2 out=flat prefix=x;
run;
data ds1(keep=id col:);
set ds1b;
if _n_=1 then set flat;
array myvar(i) col:;
array xvar(j) x:;
do over myvar;
do over xvar;
if myvar=xvar then delete;
end;
end;
run;
PROC SORT можно исключить, но это делает его более эффективным для больших наборов данных.
Или вы можете создать формат на лету:
data vec1;
set ds2;
array cvar{*} col4 col5 col6;
do ijk=1 to dim(cvar);
compvar=cvar(ijk);
output;
end;
run;
proc sort data=vec1 out=vec2 nodupkey;
by compvar;
run;
data fmt1;
set vec2;
length start $20;
fmtname="remobs";
start=compress(put(compvar,best.));
label="remove";
run;
proc format lib=work cntlin=fmt1;
run;
data ds1(drop=i);
set ds1;
array myvar(i) col:;
do over myvar;
if put(myvar,remobs.)="remove" then delete;
end;
run;
Я подозреваю, что этот последний метод будет быстрее, чем два предыдущих решения.
UPDATE
Использование хеш-объектов
data vec1;
set ds2;
array cvar{*} col4 col5 col6;
do ijk=1 to dim(cvar);
compvar=cvar(ijk);
output;
end;
run;
proc sort data=vec1 out=vec2 nodupkey;
by compvar;
run;
data ds1_new(keep=id col1 col2 col3);
if _n_ = 0 then set work.vec2;
declare hash myhash(DATASET:'work.vec2') ;
rc=myhash.defineKey('compvar');
myhash.defineDone();
set ds1;
array rcarr{*} rc1-rc3;
array lookup{*} col1 col2 col3;
do i=1 to dim(lookup);
rcarr(i)=myhash.find(key: lookup(i));
if rcarr(i)=0 then delete;
end;
run;