按SAS中的2个数据集之间的条件查找匹配项

时间:2014-08-06 14:05:40

标签: sas

我正在尝试通过我的同学和我在使用SAS的编程课程中使用的* .jsl文件中已经存在的for循环来改善处理时间。我的问题:SAS是否存在可以复制搜索和匹配条件的PROC或一系列语句?或者一种方法来浏览未分类的文件,而不是逐行寻找匹配的条件?

我们当前的脚本文件如下:

if( roadNumber_Fuel[n]==roadNumber_TO[m] & 
    fuelDate[n]>=tripStart[m] & fuelDate[n]<=TripEnd[m],
                newtripID[n] = tripID[m];
            );

我在下面简化了两组数据。

DATA1:
ID1     Date1
1      May 1, 2012
2      Jun 4, 2013
3      Aug 5, 2013
..
.

&安培;

DATA2:
ID2    Date2         Date3       TRIP_ID
1      Jan 1 2012    Feb 1 2012  9876 
2      Sep 5 2013    Nov 3 2013  931 
1      Dec 1 2012    Dec 3 2012  236
3      Mar 9 2013    May 3 2013  390
2      Jun 1 2013    Jun 9 2013  811 
1      Apr 1 2012    May 5 2012  76

...
..
.

我需要检查很多迭代,但我的目标是获得代码 检查:

Data1.ID1 = Data2.ID2 AND (Date1 >Date2 and Date1 < Date3)

我想要的输出数据集是

ID1     Date1         TRIP_ID
1      May 1, 2012    76
2      Jun 4, 2013    811

感谢您的任何见解!

1 个答案:

答案 0 :(得分:3)

您可以通过两种方式进行范围匹配。首先,如果您熟悉SQL,则可以使用PROC SQL进行匹配:

proc sql;
 create tableC as
  select * from table A
   left join table B
     on A.id=B.id and A.date > B.date1 and A.date < B.date2
  ;
quit;

其次,您可以创建一种格式。如果可以做到这一点,这通常是更快的选择。如果你有ID,这很棘手,但你可以做到。

首先,创建一个新变量ID + date。日期是18,000-20,000左右的数字,因此将您的ID乘以100,000并确保您的安全。

其次,从范围数据集创建数据集,其中START =较低的日期加上id * 100,000,END =较高的日期+ id * 100,000,FMTNAME =某些字符串将成为格式名称(必须以AZ或_开头并具有AZ,_,仅限数字)。 LABEL是您要检索的值(上例中的Trip_ID)。

data b_fmts; 
 set b;
 start=id*100000+date1;
 end  =id*100000+date2;
 label=value_you_want_out;
 fmtname='MYDATEF';
run;

然后使用PROC FORMAT和CNTLIN =`选项导入格式。

proc format cntlin=b_fmts;
quit;

确保您的日期范围不重叠 - 如果这样做会失败。

然后你可以轻松使用它:

data a_match;
 set a;
 trip_id=put(id*100000+date,MYDATEF.);
run;