5

2 つの SAS データ セットがあります。1 つ目は比較的小さく、一意の日付と対応する ID が含まれています。

date   dateID
1jan90     10
2jan90     15
3jan90     20
...

2 番目のデータ セットは非常に大きく、2 つの日付変数があります。

dt1     dt2
1jan90  2jan90
3jan90  1jan90
...

dt1と の両方を一致させる必要がdt2あるdateIDため、出力は次のようになります。

id1  id2
10   15
20   10

ここでは効率が非常に重要です。ハッシュ オブジェクトを使用して 1 つの一致を行う方法を知っているので、1 つのデータ ステップを実行して の一致を実行しdt1、次に別のステップをdt2実行できますが、両方を 1 つのデータ ステップで実行したいと考えています。これはどのように行うことができますか?

これが私がちょうどのためにマッチをする方法です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;
4

3 に答える 3

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 ;

以下のコメントに基づいて編集されたバージョン...

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 ;
于 2012-09-13T07:50:22.887 に答える
2

現在、テストするために目の前に SAS はありませんが、コードは次のようになります。

 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;

   date = dt1;
   if dts.find()=0 then do;
     id1 = dateId;
   end;

   date = dt2;
   if dts.find()=0 then do;
     id2 = dateId;
   end;

   if dt1 or dt2 then do output; * KEEP ONLY RECORDS THAT MATCHED AT LEAST ONE;

   drop date dateId;
 run;
于 2012-09-13T05:58:31.670 に答える
2

フォーマット ソリューションには同意しますが、ハッシュ ソリューションを実行する場合は、ここで行います。ここでの基本的なことは、ハッシュ自体ではなく、一致する変数としてキーを定義することです。

data tbl2;
informat date DATE7.;
input date   dateID;
datalines;
01jan90     10
02jan90     15
03jan90     20
;;;;
run;

data tbl1;
informat dt1 dt2 DATE7.;
input dt1     dt2;
datalines;
01jan90  02jan90
03jan90  01jan90
;;;;
run;
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;
 rc1 = dts.find(key:dt1);
 if rc1=0 then id1=dateID;
 rc2 = dts.find(key:dt2);
 if rc2=0 then id2=dateID;
 if rc1=0 and rc2=0 then output;
 run;
于 2012-09-13T12:33:54.547 に答える