如何使用 SAS 从姓氏(如果有的话)中删除世代后缀?
How do I remove the generational suffix from last name (if there is one) using SAS?
在我的数据集中,姓氏 (lname) 偶尔会带有世代后缀。关于世代后缀:
- lname 变量和后缀
之间没有空格或其他可能的分隔符
- 后缀长度在 2 到 4 个字符之间
- 后缀是小写、大写和正确大小写的混合
- 后缀有时包含整数和字符的组合
我试着先考虑简单的解决方案。我想不出任何使用 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;
- 您根本不能为此目的使用 compress()
- 您可以尝试使用 translate 而不是 tranwrd(它需要分隔符)。但是你不会解决替换你的pattern在单词开头或者中间的问题
- 下面是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 方法没问题,对我来说它是最可靠和最容易维护的,我只想改变两件事:
- 使用 'o' 修饰符只编译一次正则表达式
- 使用条带代替 trim(条带相当于 ltrim + rtrim)
data want;
set have;
attrib lname2 format=.;
lname2 = prxchange('s/(.*)(jr|sr|iii|iv)$//oi', 1, strip(lname));
run;
在我的数据集中,姓氏 (lname) 偶尔会带有世代后缀。关于世代后缀:
- lname 变量和后缀 之间没有空格或其他可能的分隔符
- 后缀长度在 2 到 4 个字符之间
- 后缀是小写、大写和正确大小写的混合
- 后缀有时包含整数和字符的组合
我试着先考虑简单的解决方案。我想不出任何使用 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;
- 您根本不能为此目的使用 compress()
- 您可以尝试使用 translate 而不是 tranwrd(它需要分隔符)。但是你不会解决替换你的pattern在单词开头或者中间的问题
- 下面是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 方法没问题,对我来说它是最可靠和最容易维护的,我只想改变两件事:
- 使用 'o' 修饰符只编译一次正则表达式
- 使用条带代替 trim(条带相当于 ltrim + rtrim)
data want;
set have;
attrib lname2 format=.;
lname2 = prxchange('s/(.*)(jr|sr|iii|iv)$//oi', 1, strip(lname));
run;