SAS中文论坛

标题: 关于merge by name的问题 [打印本页]

作者: shiyiming    时间: 2009-11-8 22:02
标题: 关于merge by name的问题
我有两组数据需要merge by name,但是问题是两组数据中的name不太一样,比如一组里面是abc corporation,另一组的名字是abc corp. 类似这样的情况,我试图用substr提取前三位比较,但是发现有些公司名字差别要到10位以后,而有些公司名字用缩写才3个字母。还一个比较大的问题是,一组名字是用的大写,另一组名字是用的小写,请问有没有什么好办法merge?
作者: shiyiming    时间: 2009-11-9 10:59
标题: Re: 关于merge by name的问题
我简化一下我的问题吧。我已经用upcase把所有名字改成了大写,并用compress把名字中的空格去掉了。

比如:

dataset1-name: 3M,               American Standard Com,        Consolidated edison com
而相对应的dataset2里面
dataset2-name: 3M Corp,       American Standard Inc,           Consolidated edison inc

类似这样的,我用substr选取名字的前两位显然对于长名字的这些会造成混淆,如果我substr头10位,短的,比如3M这样的就merge不起来,太长的,如consolidated......这样的就会混淆。我还试图用lengthc区分不同名字的长度,但是不管名字长短return出来都是30。

大牛们有什么好办法么?
作者: shiyiming    时间: 2009-11-9 12:32
标题: Re: 关于merge by name的问题
[code:3w3h53f4]data raw;
        length text1 text2 $30;
        infile datalines dlm=',';
        input text1 $ text2 $;
datalines;
3M,3M Corp
American  Standard Com,American Standard Inc
Consolidated edison com,Consolidated  edison inc
;

data final(drop=i);
        set raw;
        array arr{3} $ _temporary_ ('CORP' 'COM' 'INC');
        text1=compbl(upcase(text1));
        text2=compbl(upcase(text2));
        do i=1 to 3;
                text1=tranwrd(text1,arr(i),'');
                text2=tranwrd(text2,arr(i),'');
        end;
run;[/code:3w3h53f4]
作者: shiyiming    时间: 2009-11-9 12:57
标题: Re: 关于merge by name的问题
谢谢楼上大虾。

这个tranwrd我用了,不过又出现新的问题,有些公司后缀是co,于是我把这些都tranwrd成blank了。但是有的公司名字就是transcom,telecom,compell或者transcon,这个tranwrd一用,这些公司名字就全都变了。

我现在是想可不可以把名字第一个空格前的提取出来,然后取1-2个首字母,再把第一个空格后第二部分名字提取出来取2-3个首字母,然后通过这些字符段做fuzzy merge。

我用了scan(name,1)提取了最左边的第一部分名字,但是怎么提取中间的第二部分名字?
作者: shiyiming    时间: 2009-11-9 13:11
标题: Re: 关于merge by name的问题
CO前面没空格吗?
[code:3iwjl90x]data raw;
   length text1 $30;
   infile datalines dlm=',';
   input text1 $;
datalines;
transcom com
telecom        com
transcom
;

data final(drop=i);
   set raw;
   array arr{2} $ _temporary_ (' CN' ' COM');
   text1=compbl(upcase(text1));
   do i=1 to dim(arr);
      text1=tranwrd(text1,arr(i),'');
   end;
run;[/code:3iwjl90x]
作者: shiyiming    时间: 2009-11-9 13:44
标题: Re: 关于merge by name的问题
貌似上述想法也不可行,有些公司名称的差别在第三个字段,比如learning co和learning co ltd就是不一样的。

现在我想先用compress把所有空格去掉,然后比较两组名字,就像spedis那个function的作用差不多,return出个points,然后根据points<一定值的merge,这样可行不?如何实现?
作者: shiyiming    时间: 2009-11-9 15:50
标题: Re: 关于merge by name的问题
祝你好运!
作者: shiyiming    时间: 2009-11-9 17:08
标题: Re: 关于merge by name的问题
谢谢鼓励。这个fuzzy merge已经搞得我快崩溃了。

这个points方法我还没想出来怎么实现。之前我试图把名字中的每一部分都提取出来一段match,或者头两部分提取出来一段match,结果大概都只有40%能够match上,其他不是这样就是那样的问题。

我实在想不出来怎么办了,sigh......
作者: shiyiming    时间: 2009-11-10 09:26
标题: Re: 关于merge by name的问题
问题不难,麻烦的是在于你想在程序的逻辑里去包含处理各种例外的逻辑。
其实标准的方法是用数据关系表作为逻辑。程序中不要去判断。用数据说话就行了。
作者: shiyiming    时间: 2009-11-11 17:37
标题: Re: 关于merge by name的问题
原理我了解,不过例外太多咋办?人工处理?我现在就在手动修改某些东西......




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2