【发布时间】: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 函数会让我陷入循环(双关语?)。谢谢。
【问题讨论】:
-
您能否发布引发错误的真实数据子集?