楼主: 小鳄鱼a
502 11

请看看这个问题 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

300论坛币
有   a1 a2 a3  b c d e1 e2 几个,现在求他们的宏变量组合 ,其中  a1 a2 a3 a3 其中必须选两个  e1 e2 其中必须选一个 ,b c d 是任意个数任意形式的组合 ( 包括三个中任意选一个  选两个 选三个 ),请生成在一个数据集中吧,变量取名为zuhe 。

最佳答案

sniperhgy 查看完整内容

哦,如果已经有了组合,那么确实可以利用keep来做一下,方法分为两种:1)只用data部来实现,需要用到call execute语句。 2)利用宏。用哪种,看楼主的喜好了。
关键词:uhe 数据集
沙发
sniperhgy 发表于 2015-12-6 19:43:33 |只看作者 |坛友微信交流群
小鳄鱼a 发表于 2015-12-14 19:27
非常感谢   请问   假如有这样一个数据集   我想提取他们的先前预定的各种组合   那么该怎样提取  一种组 ...
哦,如果已经有了组合,那么确实可以利用keep来做一下,方法分为两种:1)只用data部来实现,需要用到call execute语句。 2)利用宏。
  1. /* 1.利用call execute 在一个data部中生成 */

  2. data _null_;
  3.   set all_combinations;  * 上一次生成的;

  4.   call execute("data comb" || strip(_N_) || ";" ||
  5.                "  set test;                   " ||
  6.                "  keep " || zuhe || ";"         ||
  7.                "run;"
  8.               );
  9. run;

  10. /* 2.借助宏语句生成 */

  11. %macro create_all_comb;
  12.   proc sql
  13.     noprint;
  14.     select count(*) into :comb_count
  15.     from all_combinations
  16.     ;
  17.   quit;

  18.   %do i = 1 %to &comb_count.;
  19.     data _null_;
  20.       set all_combinations(firstobs = &i. obs = &i.);
  21.       call symput("keep_var", strip(zuhe));
  22.     run;

  23.     data comb&i.;
  24.       set test;
  25.       keep &keep_var.;
  26.     run;
  27.   %end;
  28. %mend;

  29. %create_all_comb;
复制代码
用哪种,看楼主的喜好了。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子
Tigflanker + 2 + 3 + 4 观点有启发

总评分: 论坛币 + 5  学术水平 + 7  热心指数 + 8  信用等级 + 9   查看全部评分

使用道具

藤椅
小鳄鱼a 发表于 2015-12-6 19:44:20 |只看作者 |坛友微信交流群
请确保他们每一个都是宏变量   

使用道具

板凳
Tigflanker 发表于 2015-12-7 12:40:22 |只看作者 |坛友微信交流群
  1. %macro x(seed = 456,s2 = a1 a2 a3,s1 = e1 e2,r = b c d,rn = 2);
  2.   data temp;
  3.     do _n_ = 1 to countw("&s2. &s1. &r.");
  4.       value = scan("&s2. &s1. &r.", _n_);
  5.           order = ranuni(&seed.);
  6.           select;
  7.         when(_n_ <= countw("&s2.")) name = "s2";
  8.         when(_n_ <= countw("&s2. &s1")) name = "s1";
  9.                 otherwise name = "r&rn.";
  10.           end;
  11.           output;
  12.         end;
  13.   run;

  14.   proc sort;
  15.     by name order;
  16.   run;

  17.   data _null_;
  18.     set temp;
  19.     by name;

  20.         length want $20.;
  21.         retain want;
  22.         if first.name then do;
  23.       want = '';
  24.           count = 0;
  25.         end;

  26.         want = catx(' ',want,value);
  27.         count + 1;

  28.         if cats(count) = compress(name,,'kd') then call symputx(name,want);
  29.   run;

  30.   %put s2 = &s2. s1 = &s1. r2 = &r2. ;
  31. %mend;

  32. %x;
复制代码
方法比较笨拙,如有更好的应该采纳更好的。
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

报纸
小鳄鱼a 发表于 2015-12-7 15:31:28 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-12-7 12:40
方法比较笨拙,如有更好的应该采纳更好的。
这个好像没形成组合吧   另外   做这个好像一般是用 ncomb  就是有些复杂    所以不会做了  。  

使用道具

地板
Tigflanker 发表于 2015-12-7 15:35:30 |只看作者 |坛友微信交流群
小鳄鱼a 发表于 2015-12-7 15:31
这个好像没形成组合吧   另外   做这个好像一般是用 ncomb  就是有些复杂    所以不会做了  。
奥,你是打算把所有组合罗列到一个数据集中啊

可是为什么要叫做‘宏变量组合’啊?

使用道具

7
小鳄鱼a 发表于 2015-12-7 20:27:33 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-12-7 15:35
奥,你是打算把所有组合罗列到一个数据集中啊

可是为什么要叫做‘宏变量组合’啊?
我想着到时候可以引用   表达可能不清楚   比如如果能够排列成 88个组合的话   假如用data a_i ; keep + 宏变量组合。 利用i ,这样可以循环出 88个组合

使用道具

8
wodewin 发表于 2015-12-8 13:18:22 |只看作者 |坛友微信交流群
看了一下,是好像可以通过comb做出,但对于allcomb这个函数在PDV中的运行机制,还是不太理解
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 10 热心帮助其他会员
Tigflanker + 1 + 2 + 3 应该就用allcomb做

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

使用道具

9
sniperhgy 发表于 2015-12-11 14:12:21 |只看作者 |坛友微信交流群
小鳄鱼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个及以上?如果我的理解正确,下面的代码应该就能满足楼主的需求了。
  1. data set_a(keep = zuhe_a);
  2.   array x(3) $2. ('a1' 'a2' 'a3');

  3.   n = dim(x);

  4.   k = 2;

  5.   ncomb = comb(n, k);

  6.   do i = 1 to ncomb;
  7.     rc = allcomb(i, k, of x[*]);
  8.     zuhe_a = strip(x1) || " " || strip(x2);
  9.         output;
  10.   end;
  11. run;

  12. %macro create_set_bcd;
  13.   %do i = 1 %to 3;
  14.     data set_bcd_&i.(keep = zuhe_bcd);
  15.       array x(3) $1. ('b' 'c' 'd');
  16.       retain ncomb n;

  17.       n = dim(x);
  18.       ncomb = comb(n, &i.);
  19.       do j = 1 to ncomb;
  20.         rc = allcomb(j, &i., of x[*]);
  21.         zuhe_bcd = substr(strip(x1) || " " || strip(x2) || " " || strip(x3), 1, &i. * 2 - 1);
  22.         output;
  23.       end;
  24.     run;

  25.     proc sort
  26.       data = set_bcd_&i.;
  27.       by zuhe_bcd;
  28.     run;
  29.   %end;

  30.   data set_bcd;
  31.     set set_bcd_1 - set_bcd_3;
  32.   run;
  33. %mend;

  34. %create_set_bcd;

  35. data set_e(keep = zuhe_e);
  36.   array x(2) $2. ('e1' 'e2');

  37.   n = dim(x);

  38.   k = 1;

  39.   ncomb = comb(n, k);

  40.   do i = 1 to ncomb;
  41.     rc = allcomb(i, k, of x[*]);
  42.     zuhe_e = strip(x1);
  43.         output;
  44.   end;
  45. run;

  46. proc sql;
  47.   create table all_combinations as
  48.   select strip(zuhe_a) || " " || strip(zuhe_bcd) || " " || strip(zuhe_e) as zuhe
  49.   from set_a a, set_bcd b, set_e c
  50.   ;
  51. quit;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 25 热心帮助其他会员

总评分: 论坛币 + 25   查看全部评分

使用道具

10
小鳄鱼a 发表于 2015-12-14 19:27:27 |只看作者 |坛友微信交流群
sniperhgy 发表于 2015-12-11 14:12
楼主你好,我写了个代码,但是根据我的理解,只有42中组合,请楼主确认下我说的对不对:
1) a1 a2 a3中 ...
非常感谢   请问   假如有这样一个数据集   我想提取他们的先前预定的各种组合   那么该怎样提取  一种组合生成一个数据集    类似用 keep之类的功能


使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 10:53