1

2 つのデータセットがあります。

set.one & set.two

set.one の var1 にはフレーズが含まれており、その中には州と都市が含まれているものもあります

set.two には、米国の州のリストが含まれています。

SAS または PROC SQL を使用して、米国の州を含むフレーズを削除する目的で、2 つを比較する最も効率的な方法は何ですか?

あなたの提案に感謝します。

4

2 に答える 2

1

詳細に応じて、セット 2 または SQL 結合を使用してフォーマットを作成することをお勧めします。何かのようなもの:

data one;
format var1 $50.;
infile datalines truncover;
input @1 var1 $50.;
datalines;
Arizona
Kalamazoo
California
New Mexico
Las Cruces, New Mexico
California Pizza Kitchen
Cheese
;;;;
run;
data two;
format state $20.;
infile datalines truncover;
input @1 state $20.;
datalines;
Alabama
Arizona
Alaska
Colorado
New Mexico
California
Missouri
;;;;
run;

data for_fmt;
set two;
start=state;
label='STATE';
retain fmtname "$statef";
output;
if _n_ = 1 then do;
start=' ';
label='FALSE';
hlo='o';
output;
end;
run;

proc format cntlin=for_fmt;
quit
;

data want1;
set one;
if put(var1,$statef.)='STATE' then delete;
run;

data want2;
set one;
do __t = 1 to countc(',',var1)+1;
  x=strip(scan(var1,__t,','));
  if put(x,$STATEF.)='STATE' then delete;
end;
run;

proc sql;
  create table want3 as select * from one where not exists (
    select 1 from two where find(strip(one.var1),strip(two.state)) > 0
    );
quit;

WANT1 は最も単純で、VAR1 全体を状態にする必要があります。また、最速。WANT2 はもう少し複雑です。VAR1 のすべてが州であるか、コンマで区切られている必要があります (city,state など)。WANT3 は最も複雑な一致を許可します ("GeorgiaPeachClub" のようなものを含む任意の場所で、スペースをまったく使用せずに一致します)。ただし、データセットのサイズによっては非常に遅くなります (デカルト結合です)。

非常に大きなデータセットがある場合は、おそらくより高速な他のソリューションがあります。おそらく、SAS データセット内のハッシュ テーブル、または 1 つのデータセット内の 2 つのデータセットを反復処理するか、またはストレート アップ検索の代わりにインデックス付き検索を使用することさえあります。しかし、あなたの質問にはあまり情報がありません。テーブルのサンプルデータやテーブルのサイズなどの詳細が役立つでしょう。

于 2012-12-14T16:38:26.327 に答える
0

set.oneが大きすぎない場合は、sql-outer結合を使用して、一致しない個別の値を返すことができます。そのようです:

PROC SQL;
CREATE TABLE phrases_without_states AS
SELECT DISTINCT A.phrase
FROM set.one A OUTER JOIN set.two B
WHERE A.phrase NOT LIKE '%' + B.state + '%'
;
quit;

しかし、私は比較について少し確信が持てません。固定文字列の代わりに他の変数と同じように使用する方法を知っている人はいますか?

于 2013-01-15T09:13:27.547 に答える