私はhttp://www.sascommunity.org/mwiki/images/2/22/Hashmerge.sasし、次の例のデータセットで発見%HASHMERGE
マクロを使用しています:working
データセットでSASハッシュマージ - ハッシュオブジェクトとして小さいデータセット
data working;
length IID TYPE $12;
input IID $ TYPE $;
datalines;
B 0
B 0
A 1
A 1
A 1
C 2
D 3
;
run;
data master;
length IID FIRST_NAME MIDDLE_NAME LAST_NAME SUFFIX_NAME $12;
input IID $ FIRST_NAME $ MIDDLE_NAME $ LAST_NAME $ SUFFIX_NAME;
datalines;
X John James Smith Sr
Z Sarah Marie Jones .
Y Tim William Miller Jr
C Nancy Lynn Brown .
B Carol Elizabeth Collins .
A Wayne Mark Rooney .
;
run;
、私は_NAME
変数を添付しようとしていますこのハッシュマージを使用してmaster
データセットから取得します。出力はうまく見え、望ましい出力です。しかし、私の実際のシナリオでのmaster
データセットは大きすぎて、ハッシュオブジェクトに収まらず、マクロはハッシュオブジェクトとして配置し続けます。私は最終的にworking
データセットがハッシュオブジェクトであるところにこれらの2つのデータセットを反転したいと思いますが、コードを反転すると希望の出力を得ることができません。以下に調整し所望の出力やニーズを生成するマクロの一部ですが、私はこれを設定する方法がわからない午前:
data OUTPUT;
if 0 then set MASTER (keep=IID FIRST_NAME MIDDLE_NAME LAST_NAME SUFFIX_NAME)
WORKING (keep=IID);
declare hash h_merge(dataset:"MASTER"); /* I want WORKING to be the hash object since it's smaller! */
rc=h_merge.DefineKey("IID");
rc=h_merge.DefineData("FIRST_NAME","MIDDLE_NAME","LAST_NAME","SUFFIX_NAME");
rc=h_merge.DefineDone();
do while(not eof);
set WORKING (keep=IID) end=eof;
call missing(FIRST_NAME,MIDDLE_NAME,LAST_NAME,SUFFIX_NAME);
rc=h_merge.find();
output;
end;
drop rc;
stop;
run;
:それは何をあなたを行うには可能だが
IID FIRST_NAME MIDDLE_NAME LAST_NAME SUFFIX_NAME
---------------------------------------------------
B Carol Elizabeth Collins
B Carol Elizabeth Collins
A Wayne Mark Rooney
A Wayne Mark Rooney
A Wayne Mark Rooney
C Nancy Lynn Brown
D
作業データセットのIIDを使用してマスタデータセットをフィルタ処理した後、フィルタリングされたマスターデータセットを作業データセットとマージすると、両方のデータセットが小さく、扱いやすくなります。 –
私は 'SQL left join'フィルタを試しました。マスターデータセットの読み込み、並べ替え、' if a 'を使って 'working(in = a)master'をマージするよりも時間がかかりました。 – Foxer
これをフィルタリングしてみてください:proc sql; IIDが作業中のIIDを選択する(keep = keep = IID FIRST_NAME MIDDLE_NAME LAST_NAME SUFFIX_NAME)からselect *としてテーブルNew_masterを作成します。終了する; –