我有以下資料集:
df <- data.frame(barcode=c("B1","B2", "B3", "B4"),
sequence= sapply(1:4, function(x) paste(sample(c("A","C","T","G"), 4, replace=T), collapse="")))
我想知道每個“條形碼”與 df$barcode 中的任何其他“條形碼”的相似程度。也就是按位置。
一個完整的同意將是 100%,一個不同的立場將是 75%,依此類推。
示例:df$barcode 包含 (AATT, AATT, TATT, TATA)
那么成對相似矩陣將是
B1 B2 B3 B4
B1 x 100 75 50
B2 100 x 75 50
B3 75 75 x 75
B4 50 50 75 x
即使每個“條碼”都包含 2xT 和 2xA。所以,問題是“兩個條碼之間有多少個位置具有相同的內容?”如何在 R 中實作這一點?
uj5u.com熱心網友回復:
使用 Levenshtein(編輯)距離,或者更確切地說是 1-distance
> 1-adist(df$sequence)/4
[,1] [,2] [,3] [,4]
[1,] 1.00 0.75 0.25 0.25
[2,] 0.75 1.00 0.00 0.25
[3,] 0.25 0.00 1.00 0.50
[4,] 0.25 0.25 0.50 1.00
(假設所有長度都等于 4)。
編輯:我誤解了你的問題。Levenshtein distance 找到最大匹配,因此如有必要,請重新排序字串。在這種情況下,您需要一個精確的詞來進行詞匹配...
sapply(df$sequence,function(x){
sapply(df$sequence,function(y){
sum(strsplit(x,"")[[1]]==strsplit(y,"")[[1]])
})
})/4
ACAC AGAC CCTT CGCT
ACAC 1.00 0.75 0.25 0.00
AGAC 0.75 1.00 0.00 0.25
CCTT 0.25 0.00 1.00 0.50
CGCT 0.00 0.25 0.50 1.00
或對于評論中提供的其他向量
sapply(df$sequence,function(x){
sapply(df$sequence,function(y){
sum(strsplit(x,"")[[1]]==strsplit(y,"")[[1]])
})
})/4
GACC AAAC ACAC GCCA
GACC 1.00 0.50 0.25 0.50
AAAC 0.50 1.00 0.75 0.00
ACAC 0.25 0.75 1.00 0.25
GCCA 0.50 0.00 0.25 1.00
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340026.html
標籤:r
上一篇:保存(并打開)一個png圖串列
