如何搜索多个字符串并将其替换为字符串列表中的任何内容

时间:2012-02-23 15:32:44

标签: string r

我在数据框中有一个列,如下所示:

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'什么也没有。

有一个很好的简短技巧吗?

事实上,我有兴趣看到它在单个字符串上完成,并且在整个列表中的一个命令中完成的方式有多么不同。

3 个答案:

答案 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"