SAS中的多个哈希对象

itz*_*tzy 5 sas

我有两个SAS数据集.第一个相对较小,包含唯一日期和相应的ID:

date   dateID
1jan90     10
2jan90     15
3jan90     20
...
Run Code Online (Sandbox Code Playgroud)

第二个数据集非常大,有两个日期变量:

dt1     dt2
1jan90  2jan90
3jan90  1jan90
...
Run Code Online (Sandbox Code Playgroud)

我需要匹配both dt1dt2to dateID,所以输出将是:

id1  id2
10   15
20   10
Run Code Online (Sandbox Code Playgroud)

效率在这里非常重要.我知道如何使用哈希对象进行一次匹配,因此我可以执行一个数据步骤来执行匹配dt1,然后执行另一个步骤dt2,但我想在一个数据步骤中执行这两个操作.如何才能做到这一点?

以下是我将如何进行匹配dt1:

data tbl3;
 if 0 then set tbl1 tbl2;

 if _n_=1 then do;
  declare hash dts(dataset:'work.tbl2');
  dts.DefineKey('date');
  dts.DefineData('dateid');
  dts.DefineDone();
 end;

 set tbl1;
 if dts.find(key:date)=0 then output;
 run;
Run Code Online (Sandbox Code Playgroud)

Chr*_*s J 6

考虑到哈希表的大小,格式可能会同样有效...

data fmt ;
retain fmtname 'DTID' type 'N' ;
set tbl1 ;
start = date ;
label = dateid ;
run ;
proc format cntlin=fmt ; run ;

data tbl3 ;
  set tbl2 ;
  id1 = put(dt1,DTID.) ;
  id2 = put(dt2,DTID.) ;
run ;
Run Code Online (Sandbox Code Playgroud)

根据以下评论编辑版本......

data fmt ;
retain fmtname 'DTID' type 'I' ;
set tbl1 end=eof ;
start = date ;
label = dateid ;
output ;
if eof then do ;
  hlo = 'O' ;
  label = . ;
  output ;
end ;
run ;
proc format cntlin=fmt ; run ;

data tbl3 ;
  set tbl2 ;
  id1 = input(dt1,DTID.) ;
  id2 = input(dt2,DTID.) ;
run ;
Run Code Online (Sandbox Code Playgroud)

  • INPUT而不是PUT,并创建一个信息而不是格式.Type ='N'是格式,type ='I'(i)是一个信息. (2认同)