我有一个包含许多植物名称的表,它看起来像这样:
|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
的空格,因为所有字符串都在一起。
我如何匹配我的物种?
答案 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
,你可以替换定义,而不必重写所有代码。