我有两个数据集:
设置一和设置二
set.one 中的 var1 包含短语,其中一些包含州和城市
set.two 包含美国各州的列表。
使用 SAS 或 PROC SQL 比较两者的最有效方法是什么,目的是删除包含美国州的短语?
谢谢你的建议。
我会说你最好的选择是创建一个带有第二组的格式,或者一个 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 数据集中的哈希表,或者甚至迭代一个数据集中的两个数据集,或者可能使用索引搜索而不是直接搜索。但是您的问题中没有太多信息。更详细的信息,例如表中的示例数据和表的大小,会很有帮助。
如果 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;
不过,我对比较有点不确定。有谁知道如何使用其他变量而不是固定字符串?