2014-04-13 38 views
0

我有兩個字符向量描述相同的對象,它們由兩個不同的註釋程序產生。我需要確保註釋是相同的,但描述不一定採用相同的方式。我相信我需要手動完成大部分工作,但是我想知道是否有一個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]")) 

任何幫助,將不勝感激!謝謝

回答

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()只是分子,看看這是一個更好的措施。

0

這是可能,在stringdistjw方法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 

一些其他的方法也可以幫助你,你可以用它來確定「接近性」得分到達。

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項的所有配對。另外,第二列有屬性/物種內容,而第一列沒有。當我寫這篇關於你所提供的領域特定思想的水平時,我感到很擔心這個問題比我從一位實踐生物學家所期望的要複雜得多。這是你要求我們爲你做的一個家庭作業問題嗎?

爲了擺脫興田屬/種項目之一可以使用:

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

同樣,一個列使用「相似」,另一個則使用「樣」,這似乎代名詞,並不能真正增加信息但掩蓋任何相似性度量:

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

因此提高了「生物密度內容」與原始數據和特定領域知識的應用程序,你可以有適合於其他解決方案的應用程序什麼的進一步檢查後。

+0

@ BondedDust - 非常感謝您的回答,這爲以前的解決方案增添了非常好的觀點。我認爲沒有必要冒犯,但我提出SOF問題的原因是爲了讓人們喜歡自己的理由來解決問題,那是因爲我是新手R用戶,不是因爲我很懶,而是因爲我很懶希望你們爲我加2 + 2。我的「生物學」問題是爲了驗證對於40多個基因的兩個不同的註釋,並且我正在尋找最好的方法來做到這一點。就這樣。我沒有看到你怎麼會認爲我想讓你做我的功課。 – ChristianD

+0

你參加了冒險嗎?什麼?如果這是一個家庭作業問題,那麼你不應該告訴我們嗎?如果您在技術論壇中提出技術問題,則應該包含儘可能多的相關領域特定問題以獲得最佳答案。 –

+0

我可能誤解了你的句子。 :-) 無論如何,我已將您的方法適用於我的整個數據集,並添加了更多功能來清理我的註釋並創建「生物學豐富」術語。工作得很好! – ChristianD