我有两个数据集:
set.one& set.two
set.one中的var1包含短语,其中一些包含州和城市
set.two包含美国各州的名单。
使用SAS或PROC SQL比较两者的最有效方法是什么,目的是删除包含美国国家的短语?
感谢您的建议。
答案 0 :(得分:1)
我想说你最好的办法是创建一个带有set 2或SQL join的格式,具体取决于细节。类似的东西:
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数据集中的哈希表,甚至是在一个数据集内迭代两个数据集,或者可能使用索引搜索而不是直接搜索。但是你的问题中没有太多的信息。更多细节,例如表中的示例数据和表的大小,将会有所帮助。
答案 1 :(得分: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;
我对比较有点不确定。有谁知道如何使用其他变量代替固定字符串?