如何使用 SAS 从姓氏(如果有的话)中删除世代后缀?

How do I remove the generational suffix from last name (if there is one) using SAS?

在我的数据集中,姓氏 (lname) 偶尔会带有世代后缀。关于世代后缀:

我试着先考虑简单的解决方案。我想不出任何使用 Excel 的方法,因为他们所有的字符串解决方案都要求要删除的值的位置一致。

在SAS中,PARSE需要分隔符,TRIM需要一致的位置。

在我附加的语法中,我尝试了四种不同的方法。 None 其中成功,我完全承认用户错误。除了 COMPRESS 之外,我对它们都不熟悉,然后仅用于删除空白。

有没有办法为姓氏创建一个没有世代后缀的新变量?

非常感谢!

第一篇文章适用于我的每一次尝试。

data want;
    input id lname $ fname $;
    datalines;
        123456  Smith       John
        234567  SMITH       ANDREW
        345678  SmithJr     Alan
        456789  SMITHSR     SAM
        789012  smithiii    robert
        890123  smithIIII   william
        901234  Smith4th    Tim
        ;
run;

我的尝试从这里开始。

/* COMPRESS */
data want;
    set have;
    lname2 = compress(lname,'Jr');
    put string=;
run;

/* TRANWARD */
data want;
    set have;
    lname2 = tranwrd(lname,"Jr", "");
    lname2 = tranwrd(lname,"Sr", "");
    lname2 = tranwrd(lname,"III", "");
run;

/* PRXCHANGE */
data want;
    set have;
    lname2 = lname;
    lname2 = prxchange('s/(.*)(jr|sr|iii|iv)$//i',1,trim(lname));
run;

/* PRXMATCH */
data want;
    set have;
    if prxmatch('/Jr|Sr|III/',lname) then lname2 = '';
run;
  1. 您根本不能为此目的使用 compress()
  2. 您可以尝试使用 translate 而不是 tranwrd(它需要分隔符)。但是你不会解决替换你的pattern在单词开头或者中间的问题
  3. 下面是prxmatch的例子
    data have;
        input id lname $ fname $;
        datalines;
            123456  Smith       John
            234567  SMITH       ANDREW
            345678  SmithJr     Alan
            456789  SMITHSR     SAM
            789012  smithiii    robert
            890123  smithIIII   william
            901234  Smith4th    Tim
            901235  SRith4th    Tim
            ;
    run;
         
    data want;
        set have;
    
          /* Use PRXPARSE to compile the Perl regular expression.    */
       patternID=prxparse('/(JR$)|(SR$)|(III$)/');
          /* Use PRXMATCH to find the position of the pattern match. */
       position=prxmatch(patternID, compress(upcase(lname)));
       put position=;
       if position then do;
         put lname=;
         lname2 = '';
       end;
    run;

我认为你的 prxchange 方法没问题,对我来说它是最可靠和最容易维护的,我只想改变两件事:

  1. 使用 'o' 修饰符只编译一次正则表达式
  2. 使用条带代替 trim(条带相当于 ltrim + rtrim)
data want;
    set have;
    attrib lname2 format=.;
    lname2 = prxchange('s/(.*)(jr|sr|iii|iv)$//oi', 1, strip(lname));
run;