crackman 发表于 2010-5-7 01:09 
data a;
input x1 x2 x3 x4 x5 x6 x7 x8;
obs=_n_;
cards;
1 2 0 6 3 4 2 2
2 3 2 3 1 0 4 1
3 2 1 2 2 3 1 6
1 3 1 7 4 1 2 6
1 2 2 3 1 0 1 1
3 4 2 2 3 4 2 2
1 0 4 1 2 3 1 6
1 3 1 7 1 5 9 5
4 1 2 6 3 6 7 4
3 2 1 2 2 3 1 6
1 3 1 7 4 1 2 6
1 2 2 3 1 0 1 1
3 4 2 2 3 4 2 2
9 9 9 9 9 9 9 9
;
run;
%macro a(var);
data b;
set a;
proc sort data=b (keep=&var. obs);
by &var. ;
run;
data &var.;
set b;
by &var.;
if first.&var.=1 then do;
idx=1;
end;
else idx+1;
run;
proc sql;
create table &var. as select * ,max(idx) as num from &var. group by &var. ;
data &var.;
set &var.;
if num
merge应先根据obs排序
另我的版本 merge x1-x8用不起来
我修改了您的程序能给出正大确结果,但日志中提示有错误,请帮看一下错在那里
data a;
input x1 x2 x3 x4 x5 x6 x7 x8;
obs=_n_;
cards;
1 2 0 6 3 4 2 2
2 3 2 3 1 0 4 1
3 2 1 2 2 3 1 6
1 3 1 7 4 1 2 6
1 2 2 3 1 0 1 1
3 4 2 2 3 4 2 2
1 0 4 1 2 3 1 6
1 3 1 7 1 5 9 5
4 1 2 6 3 6 7 4
3 2 1 2 2 3 1 6
1 3 1 7 4 1 2 6
1 2 2 3 1 0 1 1
3 4 2 2 3 4 2 2
9 9 9 9 9 9 9 9
;
run;
%macro a(var);
data b;
set a;
proc sort data=b (keep=&var. obs);
by &var. ;
run;
data &var.;
set b;
by &var.;
if first.&var.=1 then do;
idx=1;
end;
else idx+1;
run;
proc sql;
create table &var. as select * ,max(idx) as num from &var. group by &var. ;
data &var.;
set &var.;
if num<3 then &var. =.;
drop num idx;
run;
proc sort data=&var.;
by obs;
run;
quit;
%mend a(var);
%macro b;
%do i=1 %to 8;
%a(x&i.);
if i=1 then do ; data result;set x&i.;end;
else if do;data result;merge result x&i.;run;end;
%end;
%mend b;
%b;