小鳄鱼a 发表于 2015-12-7 20:27
我想着到时候可以引用 表达可能不清楚 比如如果能够排列成 88个组合的话 假如用data a_i ; keep + ...
楼主你好,我写了个代码,但是根据我的理解,只有42中组合,请楼主确认下我说的对不对:
1) a1 a2 a3中必须选两个,也就是说只能选择2个,那么它的组合数是3
2) e1 e2中必须选一个,组合数是2
3)b c d 任意组合形式那么可能的状况是7
4)3 x 2 x 7 = 42
不太确定我理解的是否正确,我觉得其中有歧义的地方在于1)和2) “必选两个”这个说法,是只能选择两个,还是说2个及以上?如果我的理解正确,下面的代码应该就能满足楼主的需求了。
- data set_a(keep = zuhe_a);
- array x(3) $2. ('a1' 'a2' 'a3');
- n = dim(x);
- k = 2;
- ncomb = comb(n, k);
- do i = 1 to ncomb;
- rc = allcomb(i, k, of x[*]);
- zuhe_a = strip(x1) || " " || strip(x2);
- output;
- end;
- run;
- %macro create_set_bcd;
- %do i = 1 %to 3;
- data set_bcd_&i.(keep = zuhe_bcd);
- array x(3) $1. ('b' 'c' 'd');
- retain ncomb n;
- n = dim(x);
- ncomb = comb(n, &i.);
- do j = 1 to ncomb;
- rc = allcomb(j, &i., of x[*]);
- zuhe_bcd = substr(strip(x1) || " " || strip(x2) || " " || strip(x3), 1, &i. * 2 - 1);
- output;
- end;
- run;
- proc sort
- data = set_bcd_&i.;
- by zuhe_bcd;
- run;
- %end;
- data set_bcd;
- set set_bcd_1 - set_bcd_3;
- run;
- %mend;
- %create_set_bcd;
- data set_e(keep = zuhe_e);
- array x(2) $2. ('e1' 'e2');
- n = dim(x);
- k = 1;
- ncomb = comb(n, k);
- do i = 1 to ncomb;
- rc = allcomb(i, k, of x[*]);
- zuhe_e = strip(x1);
- output;
- end;
- run;
- proc sql;
- create table all_combinations as
- select strip(zuhe_a) || " " || strip(zuhe_bcd) || " " || strip(zuhe_e) as zuhe
- from set_a a, set_bcd b, set_e c
- ;
- quit;
复制代码