【问题标题】:Extract a substring if it has an exact match in another vector如果子字符串在另一个向量中有完全匹配,则提取子字符串
【发布时间】:2015-01-30 19:54:34
【问题描述】:

更新:这个问题的第一个版本隐含地询问如果子字符串在另一个向量中有 ANY 匹配,如何提取子字符串,例如@Colonel Beauvel 给出了优雅的回应:

这就是诀窍,基础R

newname = sapply(nametitle, function(u){
    bool = sapply(name, function(x) grepl(x, u))
    if(any(bool)) name[bool][1] else NA })

newname 
John Smith, MD PhD       Jane Doe, JD 
            "John"             "Jane"

但是,我没有意识到我实际上是在寻找一种方法来找到 exact 匹配项,直到好心贡献的函数不适用于我的向量中的所有元素。因此,以下是我修改后的问题。


假设我有以下通用名称及其学位的字符向量:

nametitle <- c("John Smith, MD PhD", "Jane Doe, JD", "John-Paul Jones, MS")

我有一个名字的“查找”向量:

name <- c("John", "Jane", "Mark", "Steve")

我要做的是搜索nametitle的每个元素,如果元素的一部分(即每个字符串的子字符串)与name中的元素完全匹配,那么在一个新的向量@ 987654327@,将nametitle的那个元素写成name的对应元素,或者如果没有完全匹配,写出nametitle的原始值。

因此,我希望正确的功能是返回 newname 并包含以下三个元素:

[1] "John" [2] "Jane" [3] "John-Paul Jones, MS"

我使用上面提供的函数尝试了以下操作:

newname = sapply(nametitle, function(u){
  bool = sapply(name, function(x) grepl(x, u))
  if(any(bool)) name[bool][1] else NA })

这对于元素"John Smith, MD Phd""Jane Doe, JD" 执行得很好,但对于"John-Paul Jones, MS" 则不行——这个元素在新向量newname 中被"John" 替换。

可以对@Colonel Beauvel 提供的原始函数进行简单的更改以解决此问题,但使用嵌套的sapply 函数会让我陷入循环(双关语?)。谢谢。

【问题讨论】:

  • 您能否发布引发错误的真实数据子集?

标签: regex r


【解决方案1】:

这就是诀窍,基础R

newname = sapply(nametitle, function(u){
    bool = sapply(name, function(x) grepl(x, u))
    if(any(bool)) name[bool][1] else NA
})

#>newname
#John Smith, MD PhD       Jane Doe, JD 
#            "John"             "Jane" 

【讨论】:

  • 天哪。这个非常有用的功能怎么还没有被整合到一个包中呢?再次感谢@Colonel Beauvel。
  • 嗨@Colonel Beauvel。请查看我修改后的问题,再次感谢您的贡献。
【解决方案2】:

这是一个简单的方法。首先,根据您的 name 向量创建一个正则表达式模式:

pattern <- paste0(".*(?<=\\s|^)(", paste(name, collapse = "|"), ")(?=\\s|$).*")
# [1] ".*(?<=\\s|^)(John|Jane|Mark|Steve)(?=\\s|$).*"

如果你使用这种模式,一个sub 命令就可以解决问题:

sub(pattern, "\\1", nametitle, perl = TRUE)
# [1] "John"                "Jane"                "John-Paul Jones, MS"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2021-02-23
    • 2021-06-23
    • 1970-01-01
    • 2023-04-10
    • 2019-03-29
    相关资源
    最近更新 更多