1

我有两个数据集:

设置一和设置二

set.one 中的 var1 包含短语,其中一些包含州和城市

set.two 包含美国各州的列表。

使用 SAS 或 PROC SQL 比较两者的最有效方法是什么,目的是删除包含美国州的短语?

谢谢你的建议。

4

2 回答 2

1

我会说你最好的选择是创建一个带有第二组的格式,或者一个 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 都是一个州,或者用逗号分隔(如城市、州)。WANT3 允许最复杂的匹配(任何地方,包括“GeorgiaPeachClub”之类的匹配,根本没有任何空格)。但是,根据数据集的大小(它是笛卡尔连接),它也非常慢。

如果你有一个非常大的数据集,还有其他可能更快的解决方案;可能是 SAS 数据集中的哈希表,或者甚至迭代一个数据集中的两个数据集,或者可能使用索引搜索而不是直接搜索。但是您的问题中没有太多信息。更详细的信息,例如表中的示例数据和表的大小,会很有帮助。

于 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 回答