楼主: 1234nu
1959 7

求助大神,如何多列匹配! [推广有奖]

  • 4关注
  • 0粉丝

已卖:148份资源

大专生

40%

还不是VIP/贵宾

-

威望
0
论坛币
1270 个
通用积分
0
学术水平
0 点
热心指数
2 点
信用等级
1 点
经验
831 点
帖子
24
精华
0
在线时间
55 小时
注册时间
2009-8-13
最后登录
2019-3-29

楼主
1234nu 发表于 2013-6-28 09:00:16 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
问题如下:表a
             ID   DATE1          DATE2         DATE3……
             1   20120305     20120508
             2   20090807    20090808
                 表b
             ID   DATE               PRICE
             1     20120305       3.6
             1     20120508       5.6
             2    20090807        8.9
             2    20090808        7.3
           ……
目的:使得a表中的每一个ID和日期都能在b表中找到与之相匹配的price,如:ID   DATE1  DATE2  PRICE1  PRICE2

    谢谢大神了!!
二维码

扫码加我 拉你入群

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

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

关键词:求助大神 Price date Rice ATE 如何

本帖被以下文库推荐

  • · sas|主题: 59, 订阅: 14

沙发
yongyitian 发表于 2013-6-28 10:41:14
是不是这样.
  1. data a;
  2. input  ID $  DATE1 yymmdd10.  DATE2 yymmdd10.  DATE3  yymmdd10.;
  3.    format ID 1.;
  4.    format date1 date2 date3 yymmdd10.;
  5. datalines;
  6. 1   20120305 20120508 20120509
  7. 2   20090807 20090808 20090809
  8. 3   20090807 20090808 20090809
  9. ; run;

  10. data b;
  11.     input ID $  DATE yymmdd10. PRICE;
  12.     format ID $1.;
  13.     format date yymmdd10.;
  14. datalines;
  15. 1  20120305 3.6
  16. 1  20120508 5.6
  17. 2  20090807 8.9
  18. 2  20090808 7.3
  19. ; run;

  20. proc sort data=a out=aa; by id date1 date2; run;

  21. proc transpose data=b out=bb(drop=_name_) prefix=date;
  22.     by id;
  23.     var date;
  24.     copy price;       
  25. run;

  26. proc transpose data=bb out=bbb(drop=_name_) prefix=price;
  27.      by id;
  28.      var price;
  29.      copy date1 date2;
  30. run;

  31. proc sort data=bbb; by id date1 date2; run;

  32. data a_b;
  33.     merge aa(in=ina) bbb(in=inb);
  34.     by id date1 date2;
  35.     if ina and inb;
  36. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
1234nu + 2 + 2 + 2 谢谢大神!

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

藤椅
pobel 在职认证  发表于 2013-6-28 11:44:46
data a;
input  ID $  DATE1 yymmdd10.  DATE2 yymmdd10.  DATE3  yymmdd10.;
   format ID 1.;
   format date1 date2 date3 yymmdd10.;
datalines;
1   20120305 20120508 20120509
2   20090807 20090808 20090809
3   20090807 20090808 20090809
; run;

data b;
    input ID $  DATE yymmdd10. PRICE;
    format ID $1.;
    format date yymmdd10.;
datalines;
1  20120305 3.6
1  20120508 5.6
1  20120509 5.88
2  20090807 8.9
2  20090808 7.3
2  20090809 7.66
3  20090807 44.9
3  20090808 33.3
3  20090809 22.66
; run;

data _null_;
     set b;
         call symputx(catx("_","P",id,date),price);
run;

data wanted;
    set a;
        array d  date1-date3;
        array p  price1-price3;
        do i=1 to 3;
           p(i)=symget(catx("_","P",id,d(i)));
        end;
        drop i;
run;

   
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
1234nu + 1 + 1 + 1 多谢!

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

和谐拯救危机

板凳
1234nu 发表于 2013-6-28 14:12:35
yongyitian 发表于 2013-6-28 10:41
是不是这样.
    谢谢大神!
    我的问题还在于表b中有关于不同ID,很多日期的数据,也就是说不仅有ID1, 20120305     20120508两日的数据,所以需要从b表中先找;而且,表a的date列有很多,考虑过用left join 分别去和表b匹配,但a表的date列有很多,所以想请教有没有其他的办法~再次谢过!

报纸
1234nu 发表于 2013-6-28 14:13:04
pobel 发表于 2013-6-28 11:44
data a;
input  ID $  DATE1 yymmdd10.  DATE2 yymmdd10.  DATE3  yymmdd10.;
   format ID 1.;
谢谢大神!
    我的问题还在于表b中有关于不同ID,很多日期的数据,也就是说不仅有ID1, 20120305     20120508两日的数据,所以需要从b表中先找;而且,表a的date列有很多,考虑过用left join 分别去和表b匹配,但a表的date列有很多,所以想请教有没有其他的办法~再次谢过!

地板
yongyitian 发表于 2013-6-29 00:29:30
1234nu 发表于 2013-6-28 14:12
谢谢大神!
    我的问题还在于表b中有关于不同ID,很多日期的数据,也就是说不仅有ID1, 20120305    ...
前面方法的思路是将数据集 b 转换成数据集 a 的格式然后合并. 如果date变量多的话,可一将其它 date 加入 第33, 36, 40 行。
或者将 date1, date2 改成 date1-daten.
还可以将第 41 行去掉,看看结果如何.

另外, 可以将数据集 a 转换成数据集 b 的格式,然后合并,transpose,最后去掉不必要的行。 如下。
  1. data a;
  2. input  ID $ DATE1 yymmdd10. DATE2 yymmdd10. DATE3 yymmdd10.;
  3.    format ID 1.;
  4.    format date1 date2 date3 yymmdd10.;
  5. datalines;
  6. 1   20120305 20120508 20120509
  7. 2   20090807 20090808 20090809
  8. 3   20090807 20090808 20090809
  9. ; run;

  10. data b;
  11.     input ID $  DATE yymmdd10. PRICE;
  12.     format ID $1.;
  13.     format date yymmdd10.;
  14. datalines;
  15. 1  20120305 3.6
  16. 1  20120508 5.6
  17. 2  20090807 8.9
  18. 2  20090808 7.3
  19. ; run;

  20. data a1;
  21.   format id $1. date yymmdd10.;
  22.   array d{*} date1-date3;
  23.      set a;
  24.      do i = 1 to dim(d);
  25.         date=d(i);
  26.         output;
  27.      end;
  28.    drop i;
  29. run;

  30. proc sort data=a1;       by id date; run;
  31. proc sort data=b out=b1; by id date; run;

  32. data a1_b1;
  33.      merge a1 b1;
  34.      by id;
  35. run;

  36. proc transpose data=a1_b1 out=a1b1(drop=_name_) prefix=price;
  37.     by id;
  38.     var price;
  39.     copy date1-date3;
  40. run;

  41. proc sort data=a1b1 out=a2b2 nodupkey;
  42.      by id;
  43. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
1234nu + 1 + 1 + 1 观点有启发

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

7
1234nu 发表于 2013-7-2 13:13:37
yongyitian 发表于 2013-6-29 00:29
前面方法的思路是将数据集 b 转换成数据集 a 的格式然后合并. 如果date变量多的话,可一将其它 date 加 ...
谢谢大神的指教!

8
jolterheadmmtt 发表于 2013-8-3 21:45:12
不懂  mark

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 21:11