用于评估字符串之间的标识的功能

时间:2014-04-13 15:22:35

标签: r similarity

我有两个描述相同对象的字符向量,它们由两个不同的注释程序生成。我需要确保注释是相同的,但描述不一定以相同的方式措辞。我相信我需要手动完成大部分工作,但我想知道是否有一个R函数可以计算,例如,两个向量的每个值之间有多少单词相等。或者也许会产生某种身份评分。通过这种方式,我至少可以按相似度得分排序。下面是一个小数据集示例:

Annotation <- data.frame(Annotation.A = c("PREDICTED: similar to endonuclease domain containing 1 Coiled-coil domain-containing protein 58", "G protein pathway suppressor 2", "adducin 3a"), Annotation.B = c("PREDICTED: endonuclease domain-containing 1 protein-like [Xiphophorus maculatus] coiled-coil domain-containing protein 58 [Salmo salar]", "PREDICTED: G protein pathway suppressor 2-like [Takifugu rubripes]", "PREDICTED: gamma-adducin-like isoform X7 [Maylandia zebra]" ))

任何帮助将不胜感激!谢谢

3 个答案:

答案 0 :(得分:2)

这定义了Annotation每行的两个元素之间的不匹配分数,并应用它为每一行提供分数:

a <- Annotation
ch <- replace(a, TRUE, lapply(a, sub, pat = " *$", replace = "")) # rm trailing spaces
w <- lapply(ch, strsplit, " ") # split into words

mismatch <- function(x, y)
  (length(setdiff(x, y)) + length(setdiff(y, x))) / length(intersect(x, y))

# calculate mismatch score for each row of Annotation
mismatches <- sapply(1:nrow(a), function(i) mismatch(w[[1]][[i]], w[[2]][[i]]))

cutoff <- 2 # might need to change this
ok <- mismatches < cutoff

同时尝试仅使用mismatch()的分子来判断这是否是更好的衡量标准。

答案 1 :(得分:1)

首先,你没有创建两个角色向量,......那些是因子向量。如果你使用角色,这将会容易得多:

 Annotation <- data.frame(Annotation.A = c("PREDICTED: similar to endonuclease domain containing 1 Coiled-coil domain-containing protein 58", "G protein pathway suppressor 2", "adducin 3a"), Annotation.B = c("PREDICTED: endonuclease domain-containing 1 protein-like [Xiphophorus maculatus] coiled-coil domain-containing protein 58 [Salmo salar]", "PREDICTED: G protein pathway suppressor 2-like [Takifugu rubripes]", "PREDICTED: gamma-adducin-like isoform X7 [Maylandia zebra]" ),
                         stringsAsFactors=FALSE)

你当然希望删除“预测:信件,因为它们有时会出现,有时候不是明确不属于内容的一部分。”

ann2 <- Annotation
ann2 <- lapply(ann2, gsub, patt="PREDICTED:", repl="")

接下来,您需要告诉我们将与什么进行比较。我们应该将第1行与第2行或第1列与第2列进行比较吗?或者第1列中所有项目与第2列的配对。此外,第二列具有属/种类内容,而第一列没有。当我写这篇文章时,我开始担心你所提供的关于这个问题的领域特定程度的水平不如我对实践生物学家所期望的那么复杂。这是您要求我们为您做的功课问题吗?

要摆脱可以使用的hte属/物种项目:

ann2[] <- lapply(ann2, gsub, patt="\\[.+\\]", repl="") 

同样,一列使用“类似于”而另一列使用“类似”,它们看起来是同义词,并不真正添加信息,但模糊了任何相似性度量:

 ann2[] <- lapply(ann2, gsub, patt="\\-like|similar to", repl="")

因此,在通过进一步检查原始数据和应用领域特定知识来提高“生物含量密度”后,您可能会有适合其他解决方案的应用。

答案 2 :(得分:0)

可能 jw包中的stringdist stringdist方法可以提供帮助:

library(stringdist)

print(stringdist("RED", "blue", method="jw", p=0))
## [1] 1

print(stringdist("light blue", "blue", method="jw", p=0))
## [1] 0.55

print(stringdist(Annotation$Annotation.A, Annotation$Annotation.B, method="jw", p=0))
## [1] 0.3210554 0.2262626 0.3890166

其他一些方法也可以帮助您获得可用于确定&#34;亲近度的分数。