【问题标题】:SAS Data Cleaning for Messy Name Variable with Middle Initial具有中间初始值的凌乱名称变量的 SAS 数据清理
【发布时间】:2015-07-14 07:10:51
【问题描述】:

我有一个杂乱无章的数据集,其中包含数百个经理姓名,有些带有中间名缩写,有些则没有(这增加了唯一经理姓名的数量以及由经理姓名运行的任何分析)。我想尽可能取全名并替换较短的名称,即如果经理姓名包含中间首字母,它将使用它来替换较短的经理姓名。下面是一个带有假名字的示例数据集:

data test;
    input project name $50.;
    datalines;
    1   Farmer,Richard
    2   Farmer,Richard L
    3   Farmer,Richard
    4   Farmer,Richard
    5   Farmer,Richard L
    6   Rooney,Douglas
    7   Rowe,Jamie Elaine
    8   Rowe,Jamie
    9   Rowe,Jamie
    10  Rowe,Jamie Elaine
    11  Smith,Mary-Lou
    12  Needs,Mark
    13  Needs,Mark H
    14  Smith,Marie
    ;
run;

因此,我想将所有 Farmer,Richard 名称替换为 Farmer,Richard L 并同样替换为其余名称。有没有一种快速的方法?我试过first.last. 方法,计数,滞后,似乎无法找到一种平滑的清洁方法。 DQMATCH 似乎做我想做的事,但我没有那个许可。有什么见解吗?

【问题讨论】:

    标签: sas data-cleaning


    【解决方案1】:

    我发现 SAS 不太适合处理这类事情。你一定要在SAS中做吗?需要考虑的一些替代方案是:

    • OpenRefine tool(以前称为 GoogleRefine,因为它最初是在那里开发的)。开始使用它相当容易,并且在多种数据清理方面非常出色。 old documentation page 上有一些不错的介绍视频。 (您需要做的就是读入数据,在名称列上创建一个“文本构面”,然后使用聚类算法。希望这会帮助您入门。)

    • 如果您可以使用 Perl、python 或类似的东西,您可以使用“fingerprint”概念来促进匹配。 (OpenRefine 将此作为其基本技术之一,但您可以普遍使用它。)我确信这种方法也可以在 SAS 中编码。一旦您为每个名字设置了指纹,您就可以在指纹足够接近时将它们分组——如果您愿意,您可以使用 SAS 中的 complev 函数来测量距离。

    【讨论】:

    • OpenRefine 看起来相当不错。在未来的项目中一定会牢记这一点。
    【解决方案2】:

    我推荐的基本策略:

    • 找出一种方法来确定您希望哪个名称成为“主”名称。
    • 找出一种识别常见名称的方法。我不清楚 Mary-Lou Smith 和 Marie Smith 是否打算成为同一个人。在您的情况下,这可能只是以某种方式对连续记录进行分组。
    • 使用您的第一种方法(用于识别主名称),给它们一些值,您可以根据该值在排序顺序中的第一个位置对其进行排序。
    • 然后进行排序,并使用 FIRST.retain 将该版本的名称保留在具有通用名称的其他行中。

    这适用于我怀疑的您的测试数据,考虑到“最长的名字是最好的”规则,并且假设姓氏的更改自动意味着一个新人和两个连续的人永远不会共享姓氏。对于您的生产数据,这些可能不是现实的规则,但您需要弄清楚如何实施这些规则。

    data test;
        input project name $50.;
        datalines;
        1   Farmer,Richard
        2   Farmer,Richard L
        3   Farmer,Richard
        4   Farmer,Richard
        5   Farmer,Richard L
        6   Rooney,Douglas
        7   Rowe,Jamie Elaine
        8   Rowe,Jamie
        9   Rowe,Jamie
        10  Rowe,Jamie Elaine
        11  Smith,Mary-Lou
        12  Needs,Mark
        13  Needs,Mark H
        14  Smith,Marie
        ;
    run;
    
    data before_groups;
        set test;
        lname= scan(name,1,',');
    run;
    
    data for_groups;
        set before_groups;
        by lname notsorted;
        if first.lname then group+1;
    run;
    
    data for_master_name;
        set for_groups;
        by group;
        name_Quality = length(name);
    run;
    
    proc sort data=for_master_name;
        by group descending name_quality;
    run;
    
    data final_name;
        set for_master_name;
        retain name_master;
        by group;
        if first.group then name_master=name;
    run;
    

    【讨论】:

    • 同样,您可以使用正则表达式创建一个仅包含缩短名称的列,例如 (.+?,.+?)(\s.+) 并采用第一组 \1 - 然后您可以按缩短的名称对原始名称进行排序命名组并占用最长的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2014-01-30
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多