楼主: 823954913
2649 4

[问答] 排列组合的问题 [推广有奖]

  • 0关注
  • 19粉丝

副教授

31%

还不是VIP/贵宾

-

威望
0
论坛币
1336 个
通用积分
7.6921
学术水平
20 点
热心指数
15 点
信用等级
19 点
经验
19254 点
帖子
268
精华
1
在线时间
1193 小时
注册时间
2009-3-7
最后登录
2025-12-12

楼主
823954913 发表于 2013-1-30 19:26:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
哪位高手能够用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



二维码

扫码加我 拉你入群

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

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

关键词:Input cards Data card COM 能够

回帖推荐

ziyenano 发表于3楼  查看完整内容

貌似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=c ...
已有 1 人评分经验 论坛币 收起 理由
webgu + 60 + 12 鼓励积极发帖讨论

总评分: 经验 + 60  论坛币 + 12   查看全部评分

沙发
823954913 发表于 2013-1-30 19:29:13
该怎么做啊?

藤椅
ziyenano 发表于 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;
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 60 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
chenys625 发表于 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;

写的水平不是很高,有改进的地方请指教。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 36 + 1 + 1 + 1 有毅力啊

总评分: 经验 + 60  论坛币 + 36  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

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

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 11:43