我列出了8个字母的DNA序列,例如:
GGAGACAA
GGATACAA
AATCAGTC
ACACCTGG
我想选择位置上与其他所有行至少有2个字母不同的所有行。理想情况下,我想保留第3,4和1或2行(但不在乎哪个)。但至少要保留3和4。最重要的是,不包括与任何其他保留线只有一个位置基差的线。
你会怎么做? R,grep / gawk是我常用的工具,但我不知道如何使用这些工具来完成看似简单的任务。
ETA的第一行和第二行只是一个字母不同(第四位置的G与T)。这就是为什么我不想保留两者。 8个碱基有大约65,000个可能的组合,因此我的大部分(〜4000行)列表应符合与所有其他行标准不同的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"