我有两个数据集:比较两个变量在不同的数据集
set.one & set.two
VAR1在set.one包含的短语,其中一些含有州和城市的
集。其中两个包含美国国家名单。
使用SAS或PROC SQL什么是两相比较,以删除包含美国各州短语的意图的最有效的方法是什么?
感谢您的建议。
我有两个数据集:比较两个变量在不同的数据集
set.one & set.two
VAR1在set.one包含的短语,其中一些含有州和城市的
集。其中两个包含美国国家名单。
使用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外连接并返回不匹配的不同值。像这样:
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;
虽然我有点不确定。有人知道如何用其他变量代替固定字符串吗?