楼主: Tigflanker
2819 5

[问答] 请问如何做笛卡尔乘积的dummy程序 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.8528
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

100论坛币
例如我有数据集a:
  1. data a;
  2. input a s d;
  3. cards;
  4. 1 1 1
  5. 1 2 2
  6. 1 3 1
  7. 2 4 2
  8. 2 2 3
  9. ;run;
复制代码
我想得到b数据集,包括24条,是a数据集中 a变量的所有情况 * s变量的所有情况 * d变量的所有情况(另外我需要考虑11组之多,希望方法能通用)

请问应该如何来做呢?

另外hard code不行喔,也就是说用do循环是不行的。

谢谢。

最佳答案

YLF870214 查看完整内容

用cross join 即可,可探索效率更高的算法
关键词:Dummy 笛卡尔 Input cards Data 笛卡尔 程序 如何

回帖推荐

jl60156 发表于4楼  查看完整内容

data temp; set a; dummy=1; run; proc means data=temp completetypes nway noprint; class a s d; var dummy; output out=want(keep=a s d) n=n; run;
Bye SAS.
若有缘,能重聚。
沙发
YLF870214 发表于 2015-5-20 17:06:52 |只看作者 |坛友微信交流群
用cross join 即可,可探索效率更高的算法
  1. proc sql noprint;
  2.    create table B as
  3.       select X.*,Y.*,Z.*
  4.          from (select distinct a from a) as X
  5.                 cross join
  6.                (select distinct s from a) as Y
  7.                 cross join
  8.                (select distinct d from a) as Z
  9.         order by a,s,d
  10.     ;
  11. quit;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 热心帮助其他会员
Tigflanker + 5 + 3 + 3 + 3 谢谢,最终就用的你这个方法

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

使用道具

藤椅
sniperhgy 发表于 2015-5-20 18:16:26 |只看作者 |坛友微信交流群
楼主你好,请试试看我的代码:
  1. data a;
  2. input a s d;
  3. cards;
  4. 1 1 1
  5. 1 2 2
  6. 1 3 1
  7. 2 4 2
  8. 2 2 3
  9. ;run;

  10. %macro CreateDescartes(in_dt, out_dt);
  11.   proc contents
  12.     noprint
  13.     data = &in_dt.
  14.     out = &in_dt._summary(keep = NAME VARNUM);
  15.   run;

  16.   proc sort
  17.     data = &in_dt._summary;
  18.     by VARNUM;
  19.   run;

  20.   data _null_;
  21.     set &in_dt._summary end = eof;
  22.     call symput(strip("var") || strip(_N_), strip(NAME));
  23.         if eof then
  24.       call symput("var_count", strip(_N_));
  25.   run;

  26.   proc sql;
  27.     create table &out_dt. as
  28.     select
  29.       %do i = 1 %to &var_count.;
  30.         &&var&i.
  31.         %if &i. lt &var_count. %then %do;
  32.          ,
  33.         %end;
  34.       %end;
  35.     from
  36.       %do i = 1 %to &var_count.;
  37.         (select distinct &&var&i.
  38.          from &in_dt.)
  39.         %if &i. lt &var_count. %then %do;
  40.          ,
  41.         %end;
  42.       %end;
  43.     ;
  44.   quit;
  45. %mend;

  46. %CreateDescartes(a, b);
复制代码

已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 热心帮助其他会员
Tigflanker + 5 + 3 + 3 + 3 谢谢,我会参考下

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

使用道具

板凳
jl60156 发表于 2015-5-20 21:34:20 |只看作者 |坛友微信交流群
data temp;
     set a;
     dummy=1;
run;
proc means data=temp  completetypes nway noprint;
     class a s d;
     var dummy;
     output out=want(keep=a s d) n=n;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 3 + 3 + 3 谢谢,这招棒极了!!

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

使用道具

报纸
yongyitian 发表于 2015-5-20 23:23:06 |只看作者 |坛友微信交流群
  1. proc sql;
  2.    create table asd as
  3.    select a.a, b.s, c.d
  4.    from a(keep=a) as a,
  5.         a(keep=s) as b,
  6.         a(keep=d) as c;
  7. quit;
  8. proc sort data=asd out=asd_sort nodup;
  9.      by a s d;
  10. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 3 + 3 + 3 非常感谢!!

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

使用道具

thanks ,  learned

使用道具

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

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

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

GMT+8, 2024-4-27 02:46