问题如下,一个数组为一个变量,如下:
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
值的所有形式就是1,2,n,m,而每个1,2一组,2肯定在1后面,每组1和2间全是n。
n可以是b和g两个值,所以我想把b和g的全排列赋值给n,那么这个全排列就是由n的个数决定的。
把不同的排列都建新的变量。
1 1 1 1 1...1 1...1...1...1
n g g g g...g b...g...g...g
n b g g g...g g...g...b...g
n b b g g...g b...b...g...g
n b b b g...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
1 1 1 1 1...1 1...1...1...1
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
1 1 1 1 1...1 1...1...1...1
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
谢谢!
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->作者: shiyiming 时间: 2009-1-27 12:19 标题: 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变量刘可以了,还可以用宏循环,生成语句。
希望对你有帮助,新年快乐。作者: shiyiming 时间: 2009-1-27 17:22 标题: Re: 给大家拜年!顺便请教个问题 谢谢!
我大概算了下总共要使真的全排了,要3百多万个 <!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? -->
很是麻烦~作者: shiyiming 时间: 2009-1-28 09:13 标题: Re: 给大家拜年!顺便请教个问题 彻彻底底的根本看不懂问题的描述。。。。。。。。。。。。。。。。。。。。作者: shiyiming 时间: 2009-1-28 09:23 标题: Re: 给大家拜年!顺便请教个问题 要不怎么是高人呢?作者: shiyiming 时间: 2009-1-28 11:06 标题: Re: 给大家拜年!顺便请教个问题 不过这种情况的原因有很大的可能是对问题的理解已经很深入了,所以觉得很多东西不用解释了。。。。。。老夫也常犯这种错误。。。。作者: shiyiming 时间: 2009-1-28 21:58 标题: Re: 给大家拜年!顺便请教个问题 呵呵,大家过年好~