楼主: scarfacetony
2535 5

求一个数据匹配 [推广有奖]

  • 2关注
  • 2粉丝

讲师

84%

还不是VIP/贵宾

-

TA的文库  其他...

从零开始

数据分析书籍资料

他山之石

威望
0
论坛币
3204 个
通用积分
10.4100
学术水平
12 点
热心指数
13 点
信用等级
13 点
经验
35351 点
帖子
256
精华
0
在线时间
829 小时
注册时间
2012-2-16
最后登录
2020-2-26

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有两份数据:
test1:用户登陆数据,有登陆时间 用户名 登陆IP的数据
test2:用户购物数据,有购物时间 用户名 消费金额数据

  1. data test1;
  2.         input time1 yymmdd10. user $2. ip $15.;
  3.         format time1 yymmdd10.;
  4.         cards;
  5. 2013/01/01 A 123.123.123.12
  6. 2013/01/02 B 123.123.123.13
  7. 2013/01/03 C 123.123.123.14
  8. 2013/01/04 A 123.123.123.15
  9. 2013/01/05 B 123.123.123.16
  10. 2013/01/06 C 123.123.123.17
  11. 2013/01/07 A 123.123.123.18
  12. 2013/01/08 B 123.123.123.19
  13. ;
  14. run;

  15. data test2;
  16.         input time2 yymmdd10. user $2. cost;
  17.         format time2 yymmdd10.;
  18.         cards;
  19. 2013/01/05 A 120
  20. 2013/01/02 A 121
  21. 2013/01/04 C 122
  22. 2013/01/07 B 130
  23. ;
  24. run;
复制代码


现在需要把两份数据进行合并,如上例中
test2第一行是A用户在1月5号购买物品,需要找到该用户在购买前的最后一次登陆,即test1中的第四行数据,并将IP数据匹配到TEST2表中
再例test2第二行是A用户在1月2号购买物品,需要找到该用户购物前最后一次登陆,即test1中的第一行数据,并将IP数据匹配到TEST2表中

最终的期望结果:
time2 user cost ip

数据量较大,不能用proc sql实现(会卡死),求助大神了。
二维码

扫码加我 拉你入群

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

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

关键词:数据匹配 proc sql format cards Input 用户名

看了这个视频,我于是有了进股市的信心!
https://bbs.pinggu.org/thread-2787427-1-1.html
沙发
boe 发表于 2013-5-16 19:09:21 |只看作者 |坛友微信交流群
data test1;
  set test1;
  time1=time1+1;
run;
proc sort data=test1;by time1;run;
proc sort data=test2;by time2;run;
data final;
  merge test1(in=in1 rename=(time1=time2)) test2(in=in2);
  by time2;
  if in1 and in2;
run;
已有 1 人评分热心指数 信用等级 收起 理由
scarfacetony + 1 + 1 非常感谢回复!

总评分: 热心指数 + 1  信用等级 + 1   查看全部评分

Gorgeous girl , I love !

使用道具

藤椅
邓贵大 发表于 2013-5-16 20:28:43 |只看作者 |坛友微信交流群
Easy if either dataset could be sorted by user id, time
Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

使用道具

板凳
yuerqieqie 发表于 2013-5-16 20:54:02 |只看作者 |坛友微信交流群
data result;
        if 0 then set test1 test2;
        if _N_ = 1 then do;
            declare hash pt(dataset:"test1", multidata: 'y');
                            pt.defineKey("user");
                            pt.defineData("time1", "ip");
                            pt.defineDone();
        end;

        set test2;
        rc = pt.find();
        if (rc = 0) then BestDistance = 9999;
        do while (rc = 0);
                Distance = time2 - time1;
                if 0 <= Distance < BestDistance then do;
                        BestDistance = Distance;
                        ip_addr = ip;
                        ip_time = time1;
                end;
                rc = pt.find_next();
                if (rc ~= 0) and BestDistance ~= 9999 then output;
        end;

        keep user time2 cost ip_time ip_addr;
        format ip_time mmddyy10.;
run;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
scarfacetony + 1 + 1 + 1 精彩帖子
boe + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

报纸
boe 发表于 2013-5-16 21:22:08 |只看作者 |坛友微信交流群
邓贵大 发表于 2013-5-16 20:28
Easy if either dataset could be sorted by user id, time
You're right! I got a wrong result.
Gorgeous girl , I love !

使用道具

地板
yongyitian 发表于 2013-5-16 22:45:23 |只看作者 |坛友微信交流群
/* the code may only works for above datasets */
/* for real data, you may need to do some filter on the merged dataset */

proc sort data=test1 out=test1_sort; by user time1; run;
proc sort data=test2 out=test2_sort; by user time2; run;

data test_merge;
     merge test1_sort test2_sort;
         time_dif = time2-time1;
         by user;
         if time_dif >=0;
run;

proc print data=test_merge;
    var user time1 time2 time_dif ip cost;
title 'test_merge'; run;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
scarfacetony + 1 + 1 + 1 这样会把每一行都匹配上去,然后取DIF最小的.
boe + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

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

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

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

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