全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2593 4
2013-01-30
哪位高手能够用lexcomb函数,得到每个观测值的所有组合情况,比如:
data a;
input x1$ x2$ x3$;
cards;
A    B    C
B    C    D
D    E    .
;
run;
希望得到下面的数据集:
Obs

comb

1

A

2

B

3

C

4

A,B

5

A,C

6

B,C

7

A,B,C

1

B

2

C

3

D

4

B,C

5

B,D

6

C,D

7

B,C,D

1

D

2

E

3

D,E



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-1-30 19:29:13
该怎么做啊?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-30 23:39:38
貌似lexcomb不能处理缺失值,
用allcomb做了一个;
data a;
input x1$ x2$ x3$;
cards;
A    B    C
B    C    D
D    E    .
;
run;

data b(keep=obs comb);
set a;
length obs 8 comb $10;
array x(3) x1-x3;
n=dim(x);
obs=0;
do i=1 to n;
   ncomb=comb(n,i);
   do j=1 to ncomb;
      call allcomb(j,i,of x(*));
      comb="";
          id=0;
          do m=1 to i;
          if x(m)="" then id+1;
          comb=catx(',',comb,x(m));
          end;
          if id=0 then do;
      obs+1;
      output;
          end;
   end;
end;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-31 11:02:36
我用宏完全实现了需求,见下面的程序。其中b是最终结果,带后缀的b是临时结果。想法是对a的每条观测都重新整理,去掉空值的变量,生成新的数据集x。然后用x生成数组做排列组合。
data a;
input x1$ x2$ x3$;
cards;
A    B    C
B    C    D
D    E    .
;
run;

data _null_;
        set a end=end;
        array x _all_;
        col=compress(dim(x));
        call symput('col',col);
        if end then do;
                obs=compress(_n_);
                call symput('obs',obs);
        end;
run;
%put &obs;
%put &col;

%macro b;
%do n=1 %to &obs;
data _null_;
set a;
if _n_=&n.;
array x _character_;
array y[&col.] $8 y1-y&col.;
do i=1 to &col.;
        if x[i]^='' then y[i]=vname(x[i]);
end;
ccc=catx(' ', of y[*]);
call execute ('data x;set a;if _n_=&n.;keep '||ccc||';run;');
run;

data _null_;
        set x;
        array x _all_;
        dim=compress(dim(x));
        call symput('dim',dim);
run;

%do k=1 %to &dim.;
        data _null_;
                ncomb=comb(&dim.,&k.)+1;
                call symput('ncomb',ncomb);
        run;

        data b&k.;
                set x;
                array x _all_;
                %do i=1 %to &ncomb.;
                        rc=lexcomb(&i.,&k.,of x[*]);
                        if rc>0 then do;
                                y=catx(',',of x1-x&k.);
                                output;
                        end;
                %end;
        drop rc;
        run;
%end;
run;

data b_&n.;
set b1-b&dim.;
run;
%end;
%mend;
%b;

data b;
set b_1-b_&obs;
run;

写的水平不是很高,有改进的地方请指教。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-31 11:02:59
ziyenano 发表于 2013-1-30 23:39
貌似lexcomb不能处理缺失值,
用allcomb做了一个;
data a;
我用宏实现了,不过挺麻烦的。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群