SAS合并不同的列

时间:2013-01-15 00:05:58

标签: sas

我有两个数据集,我想通过城市合并。问题是,一个数据集只有名称,例如:“本特利”,“卡罗琳”等。但其他数据集有例如“本特利镇”,“卡罗琳村”等。无论如何合并他们使用子串?任何建议

4 个答案:

答案 0 :(得分: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;

只需修改连接即可满足您的需求(内部,左侧,右侧,完整)。

如果您的城市名称不是彼此的子串,您可以尝试使用complevcompged计算两个名称之间的编辑距离,并尝试按照这种方式进行匹配(也许采用最接近的匹配或者最接近某些限制的匹配)。

答案 1 :(得分:1)

如果在第二个数据集中,表单始终是“word + of + actual_name”,那么我将使用带有

的datastep
city = scan(city_old,-1);

然后你可以将它们与merge-或proc sql-statement进行比较。

Here指向SAS支持扫描功能的链接。

答案 2 :(得分:0)

我建议您使用索引功能。

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212242.htm

  

在字符表达式中搜索字符串,和   返回第一个字符串的第一个字符的位置   字符串的出现。

答案 3 :(得分:0)

如果它总是'...',那么您可以使用“of”的位置来指导您。对于多字城市(“纽约市”),扫描(... -1)并不总是有效。

data test;
c1='Town of Bentley';
c1_of=find(c1,'of');
c2=substr(c1,c1_of+2);
put _all_;
run;