楼主: caibirdcnb
2305 9

[问答] 请问高手数据集A如何对数据集B进行调用? [推广有奖]

  • 0关注
  • 37粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

楼主
caibirdcnb 发表于 2016-6-5 14:19:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

各位高手,
如下表所示,请问如何根据B判断A中的weight是多少呢?依据是日期。

另外,B是不断更新的,请问如何做到以后更新B的时候不需要更新code呢?

谢谢!


数据集A:
dateweight

1997/4/16

2001/9/23



数据集B:
startdateenddateweight

1901/1/1

2000/7/5

1

2000/7/6

2002/8/21

1.007

2002/8/22

2003/6/22

1.526


二维码

扫码加我 拉你入群

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

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

关键词:数据集 Weight weigh Eight Start 如何

回帖推荐

wwwguilichao 发表于6楼  查看完整内容

data a; length date $15; input date $ ; date=cats(date); cards; 1997/4/16 1994/1/2 2001/9/23 1999/8/23 ; run; data b; length datesd dateen weight $15; input datesd$ dateen$ weight$; cards; 1994/1/1 1998/1/1 100 1998/1/2 2000/1/1 99 2000/1/2 2002/2/2 88 ; run; proc sql noprint; create table aabb as select a.*,b.weight from a left join b on a.date betw ...

沙发
caibirdcnb 发表于 2016-6-5 20:02:06
无奈弄了个无条件连接(笛卡尔连接)A和B,再依据begindate<date<enddate判断weight。
然后再删掉A中date重复的记录,只保留符合begindate<date<enddate的记录。

就是笛卡尔连接以后数据集特别大。而且感觉很傻的方法。

感觉宏和宏交互完全没问题,宏和数据集交互有symput symget resove call execute等好像也OK,但是数据集和数据集的交互就无能为力了。
不知道各位高手有什么好方法。

藤椅
caibirdcnb 发表于 2016-6-5 20:07:33
另外一点就是可以在A中增加一列将日期归类为和B一样,然后依据日期连接。
但这样的话,以后B日期更新的时候,AA中增加一列的语句也要同步更新。而上面的方法不需要更新。

A中增加一列:
if date_1<date<date_2 then do; begindate=date_1; enddate=date_2;
else if date_3<date<date_4 then do; begindate=date_3; enddate=date_4;

板凳
keym86 发表于 2016-6-6 17:26:30
我的做法是将B从startdate到enddate每天都输出一条,然后AB按日期连接。
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

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

报纸
caibirdcnb 发表于 2016-6-7 09:01:10
keym86 发表于 2016-6-6 17:26
我的做法是将B从startdate到enddate每天都输出一条,然后AB按日期连接。
请问具体的做法?想看看效率。

地板
wwwguilichao 学生认证  发表于 2016-6-7 10:46:39
data a;
        length date $15;
        input date $  ;
        date=cats(date);
cards;
        1997/4/16
        1994/1/2
        2001/9/23
        1999/8/23
        ;
run;

data b;
        length datesd dateen weight $15;
        input datesd$ dateen$ weight$;
cards;
        1994/1/1 1998/1/1 100
        1998/1/2 2000/1/1 99
        2000/1/2 2002/2/2 88
        ;
run;

proc sql noprint;
        create table aabb as
        select a.*,b.weight
        from a left join b
        on a.date between b.datesd and b.dateen;
quit;

感觉笛卡尔积是避免不了的。。。不知道有没有其他方法,不过这样可以避免你join后还去delete。。。仅供参考。。。
已有 1 人评分论坛币 收起 理由
admin_kefu + 25 热心帮助其他会员

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

7
keym86 发表于 2016-6-8 11:35:44
caibirdcnb 发表于 2016-6-7 09:01
请问具体的做法?想看看效率。
data b;

run;

8
keym86 发表于 2016-6-8 11:37:27
caibirdcnb 发表于 2016-6-7 09:01
请问具体的做法?想看看效率。
data b;
        set b;
        do date=startdate to enddate;
                output;
        end;
run;

proc sort data=a;by date;run;
proc sort data=b;by date;run;

data c;
        merge a(in=a) b(in=b);
        by date;
        if a and b;
run;

9
caibirdcnb 发表于 2016-6-8 15:45:15
wwwguilichao 发表于 2016-6-7 10:46
data a;
        length date $15;
        input date $  ;
这是我需要的答案,非常感谢!

10
caibirdcnb 发表于 2016-6-8 15:45:19
wwwguilichao 发表于 2016-6-7 10:46
data a;
        length date $15;
        input date $  ;
这是我需要的答案,非常感谢!

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

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