楼主: emilycly
554 9

[问答] SAS新手关于在一个表中查询另一个表求问? [推广有奖]

  • 0关注
  • 0粉丝

VIP1+

大专生

23%

(VIP/贵宾)四级

87%

威望
0
论坛币
1500 个
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
55 点
帖子
7
精华
0
在线时间
86 小时
注册时间
2013-1-3
最后登录
2018-3-26

emilycly 发表于 2018-1-11 22:20:59 |显示全部楼层
40论坛币
SAS新手,论坛新手,向各位大神求助。
我现在有表A和表B,都有共同的变量ID号,有n个已经按年份排序。
有两个问题:1.现在想看t年表A的ID在t+1年的表B中是否存在,并在表A中设立一个变量,存在就标1,没有存在就标0,请问怎么操作?
2.因为要做很多年的,请问怎么做这种操作的循环?
谢谢各位大神,麻烦了。
stata SPSS
舍身卫道 发表于 2018-1-11 22:21:00 |显示全部楼层
  1. %MACRO TEST_MACRO();
  2. %LET YEAR=2001;
  3. *比如暂定数据的起始年份为2001年,数据总共到2017年;
  4.         %DO I=0 %TO 16;
  5.             %LET YEAR1=%EVAL(&YEAR.+&I.);
  6.                                     PROC SORT DATA=WORK.A&YEAR1.;BY ID;RUN;
  7.                         %DO J=1 %TO 5;
  8.             %LET YEAR%EVAL(&J.)=%EVAL(&YEAR.+&I.+&J.);
  9.                         %LET T_YEAR=&&YEAR&J..;
  10.                         PROC SORT DATA=WORK.B&T_YEAR.;BY ID;RUN;
  11.                         %END;
  12.          
  13.                         DATA RSLT_&YEAR0.;
  14.                         MERGE WORK.A&YEAR0.(IN=IN0)
  15.                               WORK.B&YEAR1.(IN=IN1)
  16.                               WORK.B&YEAR2.(IN=IN2)
  17.                                                           WORK.B&YEAR3.(IN=IN3)
  18.                                                           WORK.B&YEAR4.(IN=IN4)
  19.                                                           WORK.B&YEAR5.(IN=IN5)
  20.                                   ;
  21.                         BY ID;
  22.                         IF IN0;
  23.                         IF IN0 AND IN1 THEN FLAG1=1;ESLE FLAG1=0;
  24.                         IF IN0 AND IN2 THEN FLAG2=1;ESLE FLAG2=0;
  25.                         IF IN0 AND IN3 THEN FLAG3=1;ESLE FLAG3=0;
  26.                         IF IN0 AND IN4 THEN FLAG4=1;ESLE FLAG4=0;
  27.                         IF IN0 AND IN5 THEN FLAG5=1;ESLE FLAG5=0;
  28.                         RUN;
  29.     %END;
  30. %MEND;
  31. %TEST_MACRO();
复制代码
回复

使用道具 举报

流水不朽 发表于 2018-1-12 09:21:46 |显示全部楼层
如果能给一个测试数据,或许能更容易理解你的意思!
回复

使用道具 举报

舍身卫道 发表于 2018-1-12 10:07:43 |显示全部楼层
  1. %MACRO TEST_MACRO();
  2. %LET YEAR=2001;
  3. *比如暂定数据的起始年份为2001年,数据总共到2017年;
  4.         %DO I=0 %TO 16;
  5.                 %LET YEAR1=%EVAL(&YEAR.+&I.);
  6.             %LET YEAR2=%EVAL(&YEAR.+&I.+1);
  7.                           PROC SORT DATA=WORK.CNT_&YEAR1.;BY ID;RUN;
  8.                         PROC SORT DATA=WORK.CNT_&YEAR2.;BY ID;RUN;
  9.          
  10.                         DATA RSLT_&YEAR1.;
  11.                         MERGE WORK.CNT_&YEAR1.(IN=IN1)
  12.                               WORK.CNT_&YEAR2.(IN=IN2)
  13.                                   ;
  14.                         BY ID;
  15.                         IF IN1;
  16.                         IF IN1 AND IN2 THEN FLAG=1;ESLE FLAG=0;
  17.                         RUN;
  18.     %END;
  19. %MEND;
  20. %TEST_MACRO();
复制代码
回复

使用道具 举报

emilycly 发表于 2018-1-12 10:35:45 |显示全部楼层
舍身卫道 发表于 2018-1-12 10:07
谢谢大神,不过我还有一点小问题,我在执行命令之前,是要把这n个t年的表A和n+1个t年的表B放进哪个数据库中还是怎么样重命名?因为我把这个程序敲进去执行只是出了日志而并未执行。
回复

使用道具 举报

emilycly 发表于 2018-1-12 10:36:44 |显示全部楼层
emilycly 发表于 2018-1-12 10:35
谢谢大神,不过我还有一点小问题,我在执行命令之前,是要把这n个t年的表A和n+1个t年的表B放进哪个数据库 ...
打错了,n个t+1年的表B
回复

使用道具 举报

emilycly 发表于 2018-1-12 10:50:23 |显示全部楼层

RE: SAS新手关于在一个表中查询另一个表求问?

流水不朽 发表于 2018-1-12 09:21
如果能给一个测试数据,或许能更容易理解你的意思!
我有n个表A,名称为A2000,A2001...A2016;
还有n个表B,名称为B2001,B2002...B2017;
他们有共同的变量ID,我想看A2000有没有ID在B2001、B2002、B2003、B2004、B2005中;
A2001有没有ID在B2002、B2003、B2004、B2005、B2006中;
然后如果A2000中在B2001中找到ID,则flag1标1,没有标0;
A2000在B2002中找到ID,flag2标1,其他标0;依次类推在5年内;
最后每个A表里会有五个flag变量;
都是t年的A表在t+1,t+2,t+3,t+4和t+5年的B表是否存在;
大概就是这个意思。

回复

使用道具 举报

emilycly 发表于 2018-1-12 10:51:58 |显示全部楼层
emilycly 发表于 2018-1-12 10:35
谢谢大神,不过我还有一点小问题,我在执行命令之前,是要把这n个t年的表A和n+1个t年的表B放进哪个数据库 ...
还有大神,就是我想看每个t年的表A在t+1,t+2,t+3,t+4,t+5年每年的B表中是否存在,是不是特别难实现。
回复

使用道具 举报

emilycly 发表于 2018-1-13 09:37:20 |显示全部楼层
舍身卫道 发表于 2018-1-12 13:47
您好,我在操作中出现了一个问题:
"没有解析宏J的调用。
在需要数值操作的%EVAL函数或%IF条件中发现字符操作数,条件是%J"。
请问该怎么解决,谢谢。
回复

使用道具 举报

舍身卫道 发表于 2018-1-15 10:48:45 |显示全部楼层
不好意思,原来想的程序本来只是想告诉你一下方法的,代码我没有测试,还有一些代码因为手误写错的,真是惭愧,下面我将测试过的代码发给你看下
  1. data a2001;
  2. input id;
  3. cards;
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. ;
  10. run;

  11. data b2002 b2003 b2004 b2005 b2006;
  12. input id;
  13. cards;
  14. 2
  15. 3
  16. 4
  17. 5
  18. 6
  19. ;
  20. run;

  21. %MACRO TEST_MACRO();
  22. %LET YEAR=2001;
  23. *比如暂定数据的起始年份为2001年,数据总共到2017年;
  24.         %DO I=0 %TO 0;
  25.             %LET YEAR0=%EVAL(&YEAR.+&I.);
  26.                                     PROC SORT DATA=WORK.A&YEAR0.;BY ID;RUN;
  27.                         %DO J=1 %TO 5;
  28.             %LET YEAR%EVAL(&J.)=%EVAL(&YEAR.+&I.+&J.);
  29.                         %LET T_YEAR=&&YEAR&J..;
  30.                         PROC SORT DATA=WORK.B&T_YEAR.;BY ID;RUN;
  31.                         %END;
  32.          
  33.                         DATA RSLT_&YEAR0.;
  34.                         MERGE WORK.A&YEAR0.(IN=IN0)
  35.                               WORK.B&YEAR1.(IN=IN1)
  36.                               WORK.B&YEAR2.(IN=IN2)
  37.                               WORK.B&YEAR3.(IN=IN3)
  38.                               WORK.B&YEAR4.(IN=IN4)
  39.                               WORK.B&YEAR5.(IN=IN5)
  40.                                   ;
  41.                         BY ID;
  42.                         IF IN0;
  43.                         IF IN0 AND IN1 THEN FLAG1=1;ELSE FLAG1=0;
  44.                         IF IN0 AND IN2 THEN FLAG2=1;ELSE FLAG2=0;
  45.                         IF IN0 AND IN3 THEN FLAG3=1;ELSE FLAG3=0;
  46.                         IF IN0 AND IN4 THEN FLAG4=1;ELSE FLAG4=0;
  47.                         IF IN0 AND IN5 THEN FLAG5=1;ELSE FLAG5=0;
  48.                         RUN;
  49.     %END;
  50. %MEND;
  51. %TEST_MACRO();
复制代码
回复

使用道具 举报

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

GMT+8, 2018-4-22 14:36