【问题标题】:How to search for multiple strings and replace them with nothing within a list of strings如何搜索多个字符串并将它们替换为字符串列表中的任何内容
【发布时间】:2012-02-23 15:32:43
【问题描述】:

我在这样的数据框中有一列:

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.”实例或一无所有的“博士”。

有什么不错的小技巧吗?

事实上,我很想看看它是在单个字符串上完成的,以及它在整个列表中的一个命令中完成的不同之处。

【问题讨论】:

  • 我希望避免使用正则表达式,因为我可以简单地枚举所有要删除的坏字符串。哦,我的....又一种技术(正则表达式)可以返回(重新掌握):-(
  • 该字段应该只有姓氏,但数据不一致。目标是只得到姓氏或名字的数据,并删除所有学术或其他头衔
  • 无需重新制作 - DWin、Justin 和 Tommy 已提供您需要知道的一切!只需复制和粘贴。虽然正则表达式是我多年来学到的更有用的东西之一......
  • 好吧。但如果我使用一些代码,我需要确保我理解它并且我确实知道我在做什么。

标签: string r


【解决方案1】:

其中之一:

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 可以告知意图是什么。

【讨论】:

  • @MattParker sub 确实匹配第一个实例,但它仍然是 vectorized。所以它将匹配向量的每个元素中的第一个实例。
  • @Justin 知道了,谢谢!我在考虑向量中的第一个而不是字符串中的第一个。
  • gsub 如果有 ",MD PHD";s 可能会更好。无法确定是否要删除所有其他首字母缩略词。
  • OP 中的元素 10 有两个名称,其中包含 PhD,因此需要 gsub
  • 我并不反对,尽管我认为这是一个数据输入错误并在我的测试场景中“修复”了它。
【解决方案2】:

使用一个丑陋的正则表达式:

 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)

在这三个中,正在发生的事情应该更直接。第二个替换你需要“转义”句号,因为它是一个特殊字符。

【讨论】:

  • 我喜欢组合的正则表达式,但我认为您需要在字母之间指定一个可选的文字句点而不是可选的任意字符 - 例如,考虑“Brian McDonald”。
  • 触摸!但是你想念MD。如果我在做这个数据处理,为了清晰和可重复,我会明确地用每行一个替换来做。 (或带有逻辑 Ors 的 DWin 版本)
  • 会想念 MD 吗? gsub('[M,P]\\.?D\\.?', '', "Brian McDonald, MD") 达到了预期的效果吧?
  • @MattParker 确实如此,? 是一个或零个字符。好点,还早,还没喝咖啡!
  • 我喜欢第 3 行。看起来使用 RegEx 代码可以打很多高尔夫球
【解决方案3】:

这里有一个变体,它也删除了额外的“,”。也不需要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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2017-05-02
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多