楼主: scarfacetony
2792 5

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

  • 2关注
  • 2粉丝

已卖:182份资源

讲师

83%

还不是VIP/贵宾

-

TA的文库  其他...

从零开始

数据分析书籍资料

他山之石

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

楼主
scarfacetony 发表于 2013-5-16 17:55:26 |AI写论文

+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
拉您进交流群
GMT+8, 2026-1-19 16:44