|
|
沙发

楼主 |
发表于 2009-1-27 12:19:49
|
只看该作者
Re: 给大家拜年!顺便请教个问题
data a;
input a $;
cards;
1
n
n
n
n
2
m
m
m
m
m
1
n
n
2
1
n
n
n
n
n
n
n
n
2
m
m
m
m
m
;
run;
data a1;
set a;retain c 0;
b=_n_;
if a='n' then b =0;
if a='n' then c =c+1;
run;
data a2;
set a1;
if a='n' then delete;
run;
proc sql;
select max(c) into :a3 from a2;
quit;
/*
proc transpose data=a1 out=a2;
var a b;
run;*/
%macro x(n);
data a4;
%do i=1 %to %eval(&n);
do m&i='b','g';
%end;
output;
%do i=1 %to %eval(&n);
end;
%end;
run;
%mend;
%x(14);
data a5;
set a2;
keep a b;
run;
proc transpose data=a5 out=a6;
var a;
id b;
run;
%macro z;
data a6;
set a6 a6;
run;
%mend z;
%macro y(m);
%do i=1 %to %eval(&m);
%z;
%end;
%mend;
%y(14);
data f1;
set a6;
keep _1;
run;
data f2;
set a4;
keep m1-m4;
run;
data f3;
set a6;
keep _6-_12;
run;
data f4;
set a4;
keep m5 m6;
run;
data f5;
set a6;
keep _15 _16;
run;
data f6;
set a4;
keep m7-m14;
run;
data f7;
set a6;
keep _25-_30;
run;
data end;
merge f1 f2 f3 f4 f5 f6 f7;
run;
%macro rename(old,new);
data end;
set end;
rename &old=&new;
run;
%mend;
%macro rename2;
%rename(_1,y1);
%do i=2 %to 5;
%let z=%sysevalf(&i-1);
%rename(m&z,y&i);
%end;
%do j=6 %to 12;
%rename(_&j,y&j);
%end;
%do x=13 %to 14;
%let x2=%sysevalf(&x-8);
%rename(m&x2,y&x);
%end;
%rename(_15,y15);
%rename(_16,y16);
%do e=17 %to 24;
%let e2=%sysevalf(&e-10);
%rename(m&e2,y&e);
%end;
%do r=25 %to 30;
%rename(_&r,y&r);
%end;
%mend;
%rename2;
上面是我写的代码,拿去运行,就可以了。上面的data f1-data-f7也可以用宏编程完成,14个n这个数字也可以放在宏变量里面,但是太麻烦了,直接写了。会生成30个变量的,2**14个观测。如果觉得格式不行,可以转置。
proc transpose data=end out=finish2;
var y1-y30;
run;
但是2**14个变量会打不开的。
你的第二问,如果你要处理2**14个变量数是没有意义的,太多了。
如果你是处理30个变量,可以用宏编程。
将格式相同的proc部写在macro proc部里面(r1,r2)
每次调用改变r1和r2变量刘可以了,还可以用宏循环,生成语句。
希望对你有帮助,新年快乐。 |
|