完全匹配字符串表中的子字符串

时间:2014-08-14 16:10:43

标签: r

我有一个包含许多植物名称的表,它看起来像这样:

|Parmelia sulcata, Xanthoria parietina, Lecanora muralis|
|Lecanora muralis var. saxicola, Lecanora hagenii|

我想在那里搜寻一个物种,例如Lecanora muralis(sp < - “Lecanora muralis”)。

目前,我使用for循环搜索表格。

for(g in 1:nrow(table))
{  
  such_syn<-grep(sp,table[g,5])

  if(length(such_synspalte)>0)
  {
    syn<-table[g,5]

    selbe<-which(sp == syn)
    if (length(selbe)>0)
    {....................}
  }
}

我想完全匹配我的物种“Lecanora muralis”。

我试过了:

使用grep它将匹配第1行(即确定)和第2行(这不是正常的,因为这是变量是saxicola)

我用which尝试了它,但是syn是一个看起来像这样的字符

syn <- "Parmelia sulcata, Xanthoria parietina, Lecanora muralis"

which不起作用。

然后我用strsplit(syn,",")

尝试了
syn<-c("Parmelia sulcata" " Xanthoria parietina" " Lecanora muralis")

但是那里有空格,所以问题又开始了。

我无法删除gsub的空格,因为所有字符串都在一起。

我如何匹配我的物种?

1 个答案:

答案 0 :(得分:1)

将它拆分为逗号,修剪空白,进行相等测试:

使用变体进行测试:

> require(stringr) # install this handy string-processing package if you don't have it
> syn <- "Parmelia sulcata, Xanthoria parietina, Lecanora muralis var foo"

不匹配:

> any("Lecanora muralis" == str_trim(str_split(syn,",")[[1]]))
[1] FALSE

如果没有变体,则返回TRUE:

> syn <- "Parmelia sulcata, Xanthoria parietina, Lecanora muralis"
> any("Lecanora muralis" == str_trim(str_split(syn,",")[[1]]))
[1] TRUE

尝试使用一些空格和额外的东西,仍为TRUE:

> syn <- "Parmelia sulcata, Xanthoria parietina, Lecanora muralis ,something else"
> any("Lecanora muralis" == str_trim(str_split(syn,",")[[1]]))
[1] TRUE

将其写为整洁的功能:

> exmatch = function(target, clist){any(target == str_trim(str_split(clist,",")[[1]]))}
> exmatch("Lecanora muralis", syn)
[1] TRUE
> exmatch("Lecanora muralis var foo", syn)
[1] FALSE

这也意味着当你在这里得到更好的答案时,请确保他们调用他们的函数exmatch,你可以替换定义,而不必重写所有代码。