楼主: wang226
3806 7

排列组合问题(特别难) [推广有奖]

  • 0关注
  • 0粉丝

大专生

31%

还不是VIP/贵宾

-

威望
0
论坛币
2204 个
通用积分
0.9000
学术水平
4 点
热心指数
4 点
信用等级
3 点
经验
393 点
帖子
16
精华
0
在线时间
73 小时
注册时间
2007-4-23
最后登录
2024-4-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我现在有3个数据集:

data a;
input a b c
cards;
1 2 0.02
2 5 0.04
3 4 0.05
4 7 0.08
;
run;

data b;
input a b c
cards;
1 3 0.02
2 7 0.04
3 4 0.05
4 7 0.08
;
run;

data c;
input a b c
cards;
1 5 0.02
2 6 0.04
3 4 0.05
4 8 0.08
;
run;

我的问题是:
求所有的排列组合满足条件:
a数据集中的b变量小于b数据集中的a变量,b数据集中的b变量小于c数据集中的a变量。然后输出满足条件的a,b,c数据集中的c变量值合成新的记录,最后输出所有可能的排列组合。

这个问题我想了一两年的时间了,不能解决,不知道哪位GGMM帮忙看看怎么写这个SAS程序!
二维码

扫码加我 拉你入群

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

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

关键词:Input cards sas程序 Data card 数据

沙发
hbwangliang 发表于 2013-4-20 17:49:33 |只看作者 |坛友微信交流群
还挺麻烦的哈
www.yeebee.com.cn

使用道具

藤椅
wang226 发表于 2013-4-20 17:54:55 |只看作者 |坛友微信交流群
hbwangliang 发表于 2013-4-20 17:49
还挺麻烦的哈
是啊。。想了两年了。。弄不出来

使用道具

板凳
yongyitian 发表于 2013-4-20 21:34:58 |只看作者 |坛友微信交流群
改了一下你的变量名 如下
data a;
input a1 b1 c1;
cards;
1 2 0.02
2 5 0.04
3 4 0.05
4 7 0.08
; run;

data b;
input a2 b2 c2;
cards;
1 3 0.02
2 7 0.04
3 4 0.05
4 7 0.08
; run;

data c;
input a3 b3 c3;
cards;
1 5 0.02
2 6 0.04
3 4 0.05
4 8 0.08
; run;

条件 1: b1 < a2
条件 2: b2 < a3

看看这是不是你要的结果

proc sql;                  
    create table abc as
    select a.*, b.*, c.*
    from a, b, c;
quit;

data abc1 abc2 abc3;                     
    set abc;
        if b1<a2 then output abc1;            /* satisfy condition 1 */
        if b2<a3 then output abc2;            /* satisfy condition 2 */
        if b1<a2 and b2<a3 then output abc3;  /* satisfy condition 1 and 2 */
run;

使用道具

报纸
wang226 发表于 2013-4-20 23:16:11 |只看作者 |坛友微信交流群
谢谢!这个思路不错,但是不是我想要的。我这里举例是3个数据集,但实际用的时候可能会有3百个数据集,而且每次的数据集数目还可能不一样,所以使用你这个思路的时候: data abc1 abc2 abc3 步中if条件枚举就很难了。我希望有一个通用的,不需要自己这么枚举,或者可以拼凑出枚举步也可以。我想过使用INCLUDE语句,但循环语句不能分在两个文件中。

使用道具

地板
wang226 发表于 2013-4-20 23:16:35 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-4-20 21:34
改了一下你的变量名 如下
data a;
input a1 b1 c1;
谢谢!这个思路不错,但是不是我想要的。我这里举例是3个数据集,但实际用的时候可能会有3百个数据集,而且每次的数据集数目还可能不一样,所以使用你这个思路的时候: data abc1 abc2 abc3 步中if条件枚举就很难了。我希望有一个通用的,不需要自己这么枚举,或者可以拼凑出枚举步也可以。我想过使用INCLUDE语句,但循环语句不能分在两个文件中。

使用道具

7
yongyitian 发表于 2013-4-20 23:54:59 |只看作者 |坛友微信交流群
wang226 发表于 2013-4-20 23:16
谢谢!这个思路不错,但是不是我想要的。我这里举例是3个数据集,但实际用的时候可能会有3百个数据集, ...
因不知道你想要 的结果是什么,所以给出了三种结果。

三百个数据集,太复杂了。

简单一点, 举个例子,比如十个数据集,满足什么条件,如何挑选,结果是什么。

也许有人帮忙。

使用道具

8
wang226 发表于 2013-4-21 15:52:30 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-4-20 23:54
因不知道你想要 的结果是什么,所以给出了三种结果。

三百个数据集,太复杂了。
谢谢,受你用SQL的启发,我解决这个问题了。
%MACRO repeatmake;


data earnrate_count;
set stock.earnstatics;
if buydate>=19203 and buydate<selldate;
run;

data all_earnstatics(keep=num buydate selldate earnrate);
set earnrate_count;
run;

proc sort data=earnrate_count nodupkey;
by buydate;
run;

proc sort data=all_earnstatics nodupkey;
by num buydate;
run;


data _null_;
set earnrate_count;
call symput ('number_date',_n_);
run;

sasfile all_earnstatics load;

%do date_num=1 %to &number_date;

data temp_date;
set earnrate_count;
if _n_=&date_num;
run;

data _null_;
set temp_date;
call symput ('temp_buydate',buydate);
run;

data stockhot.temp&date_num;
set all_earnstatics;
if buydate=&temp_buydate;
run;

data stockhot.temp&date_num(keep=buydate&date_num selldate&date_num earnrate&date_num);
set stockhot.temp&date_num;
rename buydate=buydate&date_num;
rename selldate=selldate&date_num;
rename earnrate=earnrate&date_num;
run;


%end;

sasfile all_earnstatics close;


data stock.buyways;
delete;
run;

%do date_num=1 %to &number_date;

%if &date_num=1 %then %do;

data buyways;
set stockhot.temp&date_num;
run;

data stock.buyways;
set buyways;
run;

%end;
%else %do;

data _null_;
call symput ('former_num',trim(left(&date_num-1)));
run;

data temp_b;
set stockhot.temp&date_num;
run;



  proc sql;
   create table temp_buyways as
   select *
   from buyways, temp_b
quit;



data buyways;
set temp_buyways;
run;

data stock.buyways;
set temp_buyways;
run;


%end;
%end;



%do date_num=1 %to &number_date;

data _null_;
call symput ('former_num',trim(left(&date_num-1)));
run;


data stock.buyways;
set stock.buyways;
if selldate&former_num>buydate&date_num then earnrate&date_num=0;
if selldate&former_num>buydate&date_num then selldate&date_num=selldate&former_num;
run;

%end;


data stock.buyways;
set stock.buyways;
earnrate_all=1;
run;

%do date_num=1 %to &number_date;

data stock.buyways;
set stock.buyways;
earnrate_all=earnrate_all+earnrate&date_num*earnrate_all;
run;

%end;





%mend repeatmake;

%repeatmake;

结合SQL和宏使用。谢谢啊!
已有 1 人评分学术水平 热心指数 收起 理由
yongyitian + 1 + 1 成功解决复杂问题

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-28 13:14