2015-07-20 20 views
1

我有8個字母的DNA序列的列表,例如:列表的簡短文字,要選擇不同的至少2行字母

GGAGACAA 
    GGATACAA 
    AATCAGTC 
    ACACCTGG 

我想選擇所有的線的在位置上至少2個字母不同於其他所有行。理想情況下,我想保留3,4行和1或2行(但不關心)。但至少,我想保留3和4.最重要的是,沒有包含任何行與其他保留行只有一個位置基礎差異。

你會怎麼做? R,grep/gawk是我常用的工具,但我無法弄清楚如何做這些簡單的任務。

ETA行1和2只有一個字母彼此不同(G對T在第四位)。這就是爲什麼我不想保留他們兩個。大約有65,000個可能的8個鹼基的組合,因此我的(〜4000行)列表中的大多數應該符合與所有其他行標準不同的2個字母。我很難弄清楚如何找到那些沒有的人。

+1

你是什麼意思「2個字母不同?」你是指兩條鏈恰好相差2個鹼基對嗎? –

+1

在上面的示例中,哪些行至少有兩個字母與「任何其他行」不同?我看到沒有兩行相差至多一個字母,所以肯定它們至少有兩個不同於其他行的字母?你能否給出一個不是*至少有兩個不同於任何(你是指每一個?)其他行的字母的例子嗎? –

+0

我改變了我的例子,試圖讓我想要更清楚 – thermophile

回答

2

使用adist

txt <- c("GGAGACAA", "GGATACAA", "AATCAGTC", "ACACCTGG") 
d <- adist(txt) 
diag(d) <- Inf 
cuts <- col(d)[lower.tri(d)][d[lower.tri(d)] <= 2] 
#[1] 1 # will be removed: 
txt[-cuts] 
#[1] "GGATACAA" "AATCAGTC" "ACACCTGG" 
+0

非常好!我不知道'adist' 我注意到距離輸出與我的「GGATACAA」和「AATCAGTC」不同 - 我的是7,'adist'是6。我猜這是因爲編輯距離可以實現一個較短的路徑,使兩個類似的使用插入(例如,當兩個字母已經在正確的順序,但不在位)而不是純粹的替代(這是我的方法)? – Ricky

5

stringdist包中有函數stringdistmatrix和許多不同的距離度量。

> library(stringdist) 
> stringdistmatrix(x, x) 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 7 7 
[2,] 1 0 6 7 
[3,] 7 6 0 5 
[4,] 7 7 5 0 

現在由您決定「2個字母不同」的含義吧!

+1

'adist(x)'給出了相同的結果。 – thelatemail

+0

不錯,不知道'stringdistmatrix'。 我猜OP是在找什麼'stringdistmatrix(x,x,「hamming」)',它應該產生與我的答案相同的輸出。 – Ricky

1

複製數據

txt <- c("GGAGACAA", "GGATACAA", "AATCAGTC", "ACACCTGG") 

比較所有序列

# split into letters 
txtw <- sapply(txt, strsplit, "") 
# find differences 
txtc <- lapply(txtw, function(x) sapply(txtw, function(y) sum(x!=y))) 

輸出是在同一個地方有多少字母的名單不同的相對於其他字母序列

> txtc 
$GGAGACAA 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
     0  1  7  7 

$GGATACAA 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
     1  0  7  7 

$AATCAGTC 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
     7  7  0  6 

$ACACCTGG 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
     7  7  6  0 

如果您的比較是針對「GGAGACAA」,則2符合您的標準

> txtc[["GGAGACAA"]] > 1 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
    FALSE FALSE  TRUE  TRUE 

但是,如果您的參考是例如「AATCAGTC」,所有的(除了「AATCAGTC」本身)滿足您的條件

> txtc[["AATCAGTC"]] > 1 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
    TRUE  TRUE FALSE  TRUE 

所以我想你需要決定哪一個是參考。如果你總結了與其他所有數據集的不同之處,我猜想對於另一個數據集,你可能會發現一些與其他所有數據不同的東西(例如,下面顯示爲3),但是你的示例顯示所有數據集都至少有2個其他字符串,它們至少有2個字母不同。

> sapply(txtc, function(x) sum(x>1)) 
GGAGACAA GGATACAA AATCAGTC ACACCTGG 
     2  2  3  3 

編輯:按照上述的辦法,來識別其是至少在不同從一切2個空間簡單地尋找那些具有非零輸出的最後一行的順序。但是在給定的樣本數據似乎並未有任何滿足這一標準,所以用不同的數據集下面我將重新運行:

txt <- c("GGAGACAA", "GGATACAA", "GGACACAA", "AGATACAA") 
txtw <- sapply(txt, strsplit, "") 
txtc <- lapply(txtw, function(x) sapply(txtw, function(y) sum(x!=y))) 
# counting the number of different sequence against all sequences 
matches <- sapply(txtc, function(x) sum(x>1)) 
# find those which has at least 1 other different sequence 
different <- matches[matches>0] 

在上面的例子中,「GGATACAA」是隻有一個字符不同一切,所以我期望輸出排除它,

> different 
GGAGACAA GGACACAA AGATACAA 
     1  1  2 

這是這種情況。上面的數字是至少有兩個字母差異的序列數。 「GGAGACAA」和「GGACACAA」只是彼此不同的一個字母,但是由於它們具有滿足該標準的另外一個序列,即「AGATACAA」,所以被保留。 「AGATACAA」有2個符合標準的其他序列。

+0

我覺得這是正確的軌道。但是我不能有一個單一的參考,我想保留所有至少有兩個鹼基不同於其他任何保留序列 – thermophile

+0

我編輯了我的答案。我認爲我的方法是有效的,但是(如果我正確地理解了你的話),你的樣本數據集沒有任何順序不符合你的標準(至少有兩個不同的基準),所以我舉了一個例子一個不同的數據集,看看你是什麼意思。 – Ricky

0
$ cat tst.awk 
{ a[NR] = $0 } 
END { 
    lgth = length(a[1]) 
    for (i=1;i<=NR;i++) { 
     maxSame = 0 

     for (j=1;j<=NR;j++) { 
      if (i != j) { 
       numSame = 0 
       for (k=1;k<=lgth;k++) { 
        if (substr(a[i],k,1) == substr(a[j],k,1)) { 
         numSame++ 
        } 
       } 
       maxSame = (numSame > maxSame ? numSame : maxSame) 
      } 
     } 

     if (maxSame < (lgth-2)) { 
      print a[i] 
     } 
    } 
} 

$ awk -f tst.awk file 
AATCAGTC 
ACACCTGG 

有很多方法可以使上面的更有效,留作練習:-)。

相關問題