我在数据框中有一个列,如下所示:
npt2$name
# [1] "Andreas Groll, M.D."
# [2] ""
# [3] "Pan-Chyr Yang, PHD"
# [4] "Suh-Fang Jeng, Sc.D"
# [5] "Mostafa K Mohamed Fontanet Arnaud"
# [6] "Thomas Jozefiak, M.D."
# [7] "Medical Monitor"
# [8] "Qi Zhu, MD"
# [9] "Holly Posner"
# [10] "Peter S Sebel, MB BS, PhD Chantal Kerssens, PhD"
# [11] "Lance A Mynderse, M.D."
# [12] "Lawrence Currie, MD"
我试过gsub
但没有运气。
执行toupper(x)
后,我需要替换“MD”或“M.D”的所有实例。或'PHD'什么也没有。
有一个很好的简短技巧吗?
事实上,我有兴趣看到它在单个字符串上完成,并且在整个列表中的一个命令中完成的方式有多么不同。
答案 0 :(得分:25)
其中任何一个:
gsub("MD|M\\.D\\.|PHD", "", test) # target specific strings
gsub("\\,.+$", "", test) # target all characters after comma
上面的Matt Parker和下面的Tommy都提出了“M.R.C.P.”,“PhD”,“D.Phil”的问题。和'博士'或者应该寻找和删除其他英国或大陆的博士学位。也许@ user56可以告知意图是什么。
答案 1 :(得分:3)
有一个丑陋的正则表达式:
gsub('[M,P].?D.?','',npt2$name)
其中说,找到字符M或P后跟零或任何一种字符,后跟D和零或一个附加字符。更明确地说,您可以分三步完成:
npt2$name <- gsub('MD','',npt2$name)
npt2$name <- gsub('M\\.D\\.','',npt2$name)
npt2$name <- gsub('PhD','',npt2name)
在这三者中,正在发生的事情应该更加直截了当。第二次替换你需要“逃避”这段时间以来的特殊性。
答案 2 :(得分:2)
这是一个删除额外“,”的变体。也不需要touppper
- 但如果您需要,只需将ignore.case=TRUE
指定为gsub
。
test <- c("Andreas Groll, M.D.",
"",
"Pan-Chyr Yang, PHD",
"Suh-Fang Jeng, Sc.D",
"Peter S Sebel, MB BS, PhD Chantal Kerssens, PhD",
"Lawrence Currie, MD")
gsub(",? *(MD|M\\.D\\.|P[hH]D)", "", test)
#[1] "Andreas Groll" ""
#[3] "Pan-Chyr Yang" "Suh-Fang Jeng, Sc.D"
#[5] "Peter S Sebel, MB BS Chantal Kerssens" "Lawrence Currie"