1

我有两个要按城市合并的数据集。问题是一个数据集只有名称,例如:“Bently”、“Caroline”等。但另一个数据集有例如“Bently 镇”、“Caroline 村”等。有没有合并他们使用子字符串?有什么建议么

4

4 回答 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;

只需修改连接,使其适合您的需求(内部、左侧、右侧、完整)。

如果您的城市名称不是彼此的子字符串,您可以尝试使用complevor计算两个名称之间的编辑距离,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 回答