R中的部分字符串匹配?这可能吗?

问题描述

我实际上不确定是否可行。我有这两个具有科学名称的数据框。其中有些拼写错误,有些缺少空格,有些则是同音异义词(不是同一个物种),有些则匹配。所以我有这样的东西:

stringDF <- data.frame(string = c("Abietinella abietina (Hedw.) M.Fleisch.","Abietinella abietina (Hedw.) M. Fleisch.","Abietinella abietina (Hedw.) Smith","Abitinella abietina (Hedw.) M. Fleisch."))
patternDF <- data.frame(string = "Abietinella abietina (Hedw.) M. Fleisch.",match = "A")

patternDF具有“正确名称”和一列(我称之为包含重要信息的“ match”。我试图在stringDF中创建一个“ match”列,其中部分匹配时会粘贴“ A”。所以理想情况下,我想要这样的东西:

string                                      match
Abietinella abietina (Hedw.) M.Fleisch.     A
Abietinella abietina (Hedw.) M. Fleisch.    A
Abietinella abietina (Hedw.) Smith          NA
Abitinella abietina (Hedw.) M. Fleisch.     A

我尝试使用此功能

stringDF$match <- patternDF$match[pmatch(stringDF$string,patternDF$string)]

但是我没有任何运气。在R中可以这样做吗?我也尝试过使用data.frame包中的%like%函数

我不是最擅长编码的人,所以请您对我的无知深表歉意!谢谢大家!

解决方法

您可以使用stringdist库(cran here)来完成此操作,而无需使用正则表达式来解决一些黑客问题。正则表达式模糊匹配在某些软件包和其他语言中可用(例如PyPi regex for Python-请参阅近似“模糊”匹配)。

无论如何,最好为您的案例使用Levenshtein距离函数(有关更多信息,请使用Levenshtein距离函数-this link上有不错的信息)。

library(stringdist)

stringdist("Abietinella abietina (Hedw.) M. Fleisch.",c("Abietinella abietina (Hedw.) M.Fleisch.","Abietinella abietina (Hedw.) M. Fleisch.","Abietinella abietina (Hedw.) Smith","Abitinella abietina (Hedw.) M. Fleisch."))

运行上面的代码将产生以下结果:

1 0 9 1

分别是4个琴弦中每个琴弦的Levenshtein距离。您可以将结果与某些编码逻辑一起使用,以仅接受具有足够低的Levenshtein值的结果。根据您当前的字符串,我可能建议仅保留具有值<=4的字符串,但是您可以根据需要进行调整。