2012-12-14 85 views
1

我有两个数据集:比较两个变量在不同的数据集

set.one & set.two

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

集。其中两个包含美国国家名单。

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

感谢您的建议。

回答

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数据集中的哈希表,或者甚至在一个数据集内的两个数据集上迭代,或者可能使用索引搜索而不是直接搜索。但是你的问题中没有太多的信息。更详细的信息,如表格中的示例数据和表格的大小,将会有所帮助。

0

如果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; 

虽然我有点不确定。有人知道如何用其他变量代替固定字符串吗?