楼主: ausser
3917 12

[问答] [求助] PROC SQL 生成关于同一变量各观测的排列组合 [推广有奖]

  • 6关注
  • 1粉丝

讲师

13%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
1.0000
学术水平
2 点
热心指数
5 点
信用等级
0 点
经验
7949 点
帖子
67
精华
0
在线时间
800 小时
注册时间
2009-10-16
最后登录
2022-7-3

楼主
ausser 发表于 2014-4-5 16:10:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

请大家帮忙看一下,假设现在有1个变量(变量名 var1)包含3条观测(a、b、c),具体如下:

  1. var1
  2. a
  3. b
  4. c
复制代码

现在想用 proc sql 生成一个新的表,表中的行、列(列名 new_var)如下:

  1. new_var
  2. a
  3. ab
  4. abc
  5. ac
  6. acb
  7. b
  8. ba
  9. bac
  10. bc
  11. bca
  12. c
  13. ca
  14. cab
  15. cb
  16. cba
复制代码

亦即由原来的3条观测通过排列的方式生成 \[P_{3}^{1}+P_{3}^{2}+P_{3}^{3}=15\] 条新的行(观测)。想了很长时间也没有解决,希望大家帮忙看看,万分感谢。

PS: 当然不用 proc sql 也行,只要最后能生成上述列就可以了,谢谢大家啦^^

二维码

扫码加我 拉你入群

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

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

关键词:proc sql sql ROC LaTeX atex

沙发
jzx江湖浪子 发表于 2014-4-6 00:25:07
我来膜拜高手。

藤椅
zhengbo8 发表于 2014-4-6 01:17:05
完美实现。若把SQL部分改成宏,就可以通用。

  1. data a;
  2.         input x $;
  3. datalines;
  4. a
  5. b
  6. c
  7. ;

  8. proc sql noprint;

  9.         create table b as
  10.                 select * from a
  11.                 outer union
  12.                 select * from (
  13.                         select *
  14.                                 from a(rename=(x=x1)) as l, a(rename=(x=y1)) as r
  15.                                 where l.x1<> r.y1
  16.                 )

  17.                 outer union
  18.                 select * from (
  19.                         select * from a(rename=(x=z)) as l, (
  20.                                 select * from a(rename=(x=x2)) as l,a(rename=(x=y2)) as r
  21.                                 where l.x2<> r.y2
  22.                         ) as r
  23.                         where (l.z<> r.x2 and  l.z<> r.y2)
  24.                 );

  25. quit;

  26. data b(keep=x);
  27.         set b;
  28.         length x $ 3;
  29.         x=catt(x,x1,y1,z,x2,y2);
  30. run;

  31. proc sort data=b;by x;run;
复制代码


板凳
yongyitian 发表于 2014-4-6 01:34:23
  1. /* datastep solution just for the case, not for all cases */

  2. data one;
  3.    input var1 $;
  4. datalines;
  5. a
  6. b
  7. c
  8. ; run;

  9. data _null_;
  10. length new $30;
  11.    set one;
  12.        new = var1;
  13.        put new=;
  14.       do p= 1 to nobs;
  15.        set one(rename=var1=var2) nobs=nobs point=p;
  16.          if trim(var1) ^= trim(var2) then do; new = cats(var1, var2);
  17.          put new=; end;
  18.         do p1 = 1 to nobs;
  19.          set one(rename=var1=var3) nobs=nobs point = p1;
  20.            if  trim(var1) ^= trim(var2)
  21.            and trim(var1) ^= trim(var3)
  22.            and trim(var2) ^= trim(var3) then do; new = cats(var1, var2, var3);
  23.            put new=; end;
  24.          end;
  25.      end;
  26. run;
复制代码

报纸
farmman60 发表于 2014-4-6 06:55:07
data have;
input var $;
cards;
a
b
c
;
run;

data have1;
set have have;
run;


data _null_;
if 0 then set have(rename=(var=_var));
if _n_=1 then do;
  declare hash h(dataset:'have(rename=(var=_var))',ordered:'a');
  h.definekey('_var');
  h.definedata('_var');
  h.definedone();
  declare hiter hi ('h');
end;
set have1 end=last;
h.find(key:var);
do rc=hi.next() by 0 while (rc=0);
  if findc(compress(_var),compress(var))=0 then do;
   _var=cats(var,_var);
    h.ref();
  end;
rc=hi.next();
end;
if last then h.output(dataset:'want(rename=_var=var)');
run;
   

地板
ausser 发表于 2014-4-6 09:00:54
zhengbo8 发表于 2014-4-6 01:17
完美实现。若把SQL部分改成宏,就可以通用。
嗯嗯~ 非常感谢,正在尝试宏的改写 ^^

7
ausser 发表于 2014-4-6 09:05:11
yongyitian 发表于 2014-4-6 01:34
非常感谢!

8
ausser 发表于 2014-4-6 09:05:48
farmman60 发表于 2014-4-6 06:55
data have;
input var $;
cards;
非常感谢!

9
bobguy 发表于 2014-4-6 09:49:55
you can leverage the proc plan to do it.


proc format ;
value trmt
   1='a'
   2='b'
   3='c'
   other=' '
   ;
run;

proc plan;
   factors Block=3 ordered
           Treat= 1 of 3 perm;
   ods output Plan=Combinations1;
run;

proc plan;
   factors Block=6 ordered
           Treat= 2 of 3 perm;
   ods output Plan=Combinations2;
run;

proc plan;
   factors Block=6 ordered
           Treat= 3 of 3 perm;
   ods output Plan=Combinations3;
run;

data all;
  length new_var $3;
  set Combinations1
  Combinations2
  Combinations3
  ;
  new_var=catt(put(Treat1,trmt.),put(Treat2,trmt.),put(Treat3,trmt.));

  keep new_var;
  run;

  proc print;run;

10
ausser 发表于 2014-4-6 09:51:13
zhengbo8 发表于 2014-4-6 01:17
完美实现。若把SQL部分改成宏,就可以通用。

...表示 macro 的技术不到家,虽然知道要做什么,但完全不知道怎么改(因为 select * from 子块的数量是递增的)==...

能否给点提示和帮助,谢谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-14 10:57