删除 SAS 中的重复子字符串
Posted
技术标签:
【中文标题】删除 SAS 中的重复子字符串【英文标题】:Removing duplicate substring in SAS 【发布时间】:2021-03-09 20:07:28 【问题描述】:在以下示例数据中,我尝试使用以下代码删除字符串中的重复子字符串:
data z;
input pvd_name_orig $50.;
datalines;
MD SMITH, JOHN MD
SMITH, JOHN W
MD T SMITH, JOHN W.
SMITH, JOHN WILLIAM
JOHN N MD SMITH MD
MD JOHN W. SMITH MD
MD SMITH, MD JOHN
;
run;
DATA want (keep=pvd_name_orig pvd_name_temp);
SET pvd_pmd_md;
pvd_name_temp=scan(pvd_name_orig, 1, ' ');
do i=2 to countw(pvd_name_orig,' ');
word=scan(pvd_name_orig, i, ' ');
found=find(pvd_name_temp, word, 'it');
if found=0 then pvd_name_temp=catx(' ', pvd_name_temp, word);
end;
run;
但是,上面的代码适用于所有名称,除了中间名首字母在字符串中重复的名称。在这种情况下,它会删除中间名的首字母,将其视为重复。有什么办法可以避免删除字符串中的单字母单词?
我尝试在中间名初始后手动添加一个句点,然后代码不会在新变量中删除它。但是,我无法使用 SAS 代码在中间名初始后添加句点。 我使用以下代码在第二个单词的第二个位置(随机)添加一个句点,但它只在字符串中的第二个字符添加一个句点。
data want;
set z;
if length(compress(scan(pvd_name_orig,2,' '),'.'))=1 then substr(pvd_name_orig,2,1)='.';
run;
我最终想要的输出是
Obs pvd_name_orig pvd_name_temp
1 MD SMITH, JOHN MD MD SMITH, JOHN
2 SMITH, JOHN W SMITH, JOHN W
3 MD T. SMITH, JOHN W. MD T. SMITH, JOHN W.
4 SMITH, JOHN WILLIAM SMITH, JOHN WILLIAM
5 JOHN N MD SMITH MD JOHN N MD SMITH
6 MD JOHN W. SMITH MD MD JOHN W. SMITH
7 MD SMITH, MD JOHN MD SMITH, JOHN
有什么建议吗??
【问题讨论】:
为什么JOHN N
不想转换成JOHN N.
模糊匹配不干净的数据在最好的情况下是有问题的。 SAS 有专门处理这个问题的产品,而 LinkKing 是免费软件,旨在处理其中一些问题,但不确定您的数据是否适合。 the-link-king.party
@Richard JOHN N
可以转换为JOHN N.
这不是问题。
您能否将问题标题更新为重复标记,或重复单词。如果医生的名字和姓氏相同怎么办?如果名称包含单个字母后跟逗号怎么办?逗号前应该加句号吗?
【参考方案1】:
正则表达式可用于解决问题。这里\b是单词边界,\S+是不带空格的字符串,(\b\S+\b)是不带空格的单词; (.*)
是什么,第一个(\1)是需要删除的(\b\S+\b)的重复词; \1\2 表示保持 (\b\S+\b)(.*)。
data z;
input name $50.;
new_name=prxchange('s/(\b\S+\b)(.*)(\1)/\1\2/',-1,strip(name));
datalines;
MD SMITH, JOHN MD
SMITH, JOHN W
MD T SMITH, JOHN W.
SMITH, JOHN WILLIAM
JOHN N MD SMITH MD
MD JOHN W. SMITH MD
MD SMITH, MD JOHN
;
run;
【讨论】:
以上是关于删除 SAS 中的重复子字符串的主要内容,如果未能解决你的问题,请参考以下文章