我有两个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 dt1和dt2to 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)
考虑到哈希表的大小,格式可能会同样有效...
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)