SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 962|回复: 9
打印 上一主题 下一主题

关于merge by name的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-11-8 22:02:33 | 只看该作者

关于merge by name的问题

我有两组数据需要merge by name,但是问题是两组数据中的name不太一样,比如一组里面是abc corporation,另一组的名字是abc corp. 类似这样的情况,我试图用substr提取前三位比较,但是发现有些公司名字差别要到10位以后,而有些公司名字用缩写才3个字母。还一个比较大的问题是,一组名字是用的大写,另一组名字是用的小写,请问有没有什么好办法merge?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-11-9 10:59:03 | 只看该作者

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。

大牛们有什么好办法么?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-11-9 12:32:51 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-11-9 12:57:20 | 只看该作者

Re: 关于merge by name的问题

谢谢楼上大虾。

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

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

我用了scan(name,1)提取了最左边的第一部分名字,但是怎么提取中间的第二部分名字?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-11-9 13:11:56 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-11-9 13:44:42 | 只看该作者

Re: 关于merge by name的问题

貌似上述想法也不可行,有些公司名称的差别在第三个字段,比如learning co和learning co ltd就是不一样的。

现在我想先用compress把所有空格去掉,然后比较两组名字,就像spedis那个function的作用差不多,return出个points,然后根据points<一定值的merge,这样可行不?如何实现?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-11-9 15:50:26 | 只看该作者

Re: 关于merge by name的问题

祝你好运!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-11-9 17:08:46 | 只看该作者

Re: 关于merge by name的问题

谢谢鼓励。这个fuzzy merge已经搞得我快崩溃了。

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

我实在想不出来怎么办了,sigh......
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-11-10 09:26:08 | 只看该作者

Re: 关于merge by name的问题

问题不难,麻烦的是在于你想在程序的逻辑里去包含处理各种例外的逻辑。
其实标准的方法是用数据关系表作为逻辑。程序中不要去判断。用数据说话就行了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-11-11 17:37:48 | 只看该作者

Re: 关于merge by name的问题

原理我了解,不过例外太多咋办?人工处理?我现在就在手动修改某些东西......
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 06:20 , Processed in 0.068256 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表