我有两个要按城市合并的数据集。问题是一个数据集只有名称,例如:“Bently”、“Caroline”等。但另一个数据集有例如“Bently 镇”、“Caroline 村”等。有没有合并他们使用子字符串?有什么建议么
问问题
162 次
4 回答
2
你可以像这样使用index
函数proc sql
:
data data_a;
input city $ x;
datalines;
London 1
York 4
Bukovica 10
Berlin 3
;
run;
data data_b;
input city $1-15 y;
datalines;
Good Old London 10
New York 40
Spisic Bukovica 100
;
run;
proc sql;
create table merge as
select a.city as city_a
,b.city as city_b
,x
,y
from data_a as a
inner join
data_b as b
on index(b.city, strip(a.city)) > 0 or index(a.city, strip(b.city)) > 0;
quit;
只需修改连接,使其适合您的需求(内部、左侧、右侧、完整)。
如果您的城市名称不是彼此的子字符串,您可以尝试使用complev
or计算两个名称之间的编辑距离,compged
并尝试以这种方式进行一些匹配(可能采用最接近的匹配或超过某个限制的最接近的匹配)。
于 2013-01-15T09:11:33.497 回答
1
如果在第二个数据集中,表单始终是“word + of + actual_name”,那么我将使用 datastep
city = scan(city_old,-1);
然后您可以将两者与合并或 proc sql 语句进行比较。
这里是扫描功能的 SAS 支持的链接。
于 2013-01-15T08:47:56.943 回答
0
我建议你使用索引功能。
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212242.htm
在字符表达式中搜索字符串,并返回字符串第一次出现时字符串的第一个字符的位置。
于 2013-01-15T00:12:28.503 回答
0
如果总是'... of',那么你可以用“of”的位置来引导你。扫描 (... -1) 在多词城市(“纽约市”)的情况下并不总是有效。
data test;
c1='Town of Bentley';
c1_of=find(c1,'of');
c2=substr(c1,c1_of+2);
put _all_;
run;
于 2013-01-15T15:20:11.787 回答