我有一些数据描述一组离散事件(或状态)的有序集合。有34种可能的状态,它们可以以任何顺序发生并且可以重复。每个事件序列可以包含任意数量的事件,并且至关重要的是,有两个以上的事件序列。我的最终目的是将这些序列聚类为相似的子集,但是我的直觉是,除非将这些序列对齐,以使等效事件在所有序列中都占据相同的位置,否则这是没有意义的。
我对生物学序列的多重比对非常熟悉,但是为此我遇到的所有软件(肌肉,MAFFT,T-COFFEE,Clustal *等)都需要DNA,RNA或AA序列,而我状态比其他任何状态都要多,所以我无法让它们工作。
我在R中发现了 pairwise 对齐算法的各种实现,例如Needleman-Wunsch,但到目前为止,还没有遇到任何的任何通用(非生物)实现。多种序列比对算法。
例如,说我的数据如下:
1: ABCDEFG
2: ACDGH
3: BDEFEGI
4: AH
5: DEGHI
我的目标是使它看起来像这样:
1: ABCDEF-G--
2: A-CD---GH-
3: -B-DEFE--I
4: A-------H-
5: ---DE--GHI
其中-
符号表示此序列中不存在事件。这是一个简化的示例,实际上,我正在寻找某种与生物序列MSA算法相同的方法来惩罚缺口(-
)的出现。
我发现唯一可能似乎可以做到这一点的软件是Alphamalig(http://alggen.lsi.upc.es/recerca/align/alphamalig/intro-alphamalig.html),但是它已经很旧了,我无法在我的机器上运行它。理想情况下,我希望可以在R中实现某些功能。
答案 0 :(得分:2)
假设我们需要与LETTERS
匹配,则一个选项是str_match
,然后将NA
更改为-
,paste
library(stringr)
library(dplyr)
f1 <- Vectorize(function(x) str_match(x, LETTERS))
out1 <- f1(v1)
do.call(paste0, as.data.frame(t(replace_na(out1[!!rowSums(!is.na(out1)),], '-'))))
#[1] "ABCDEFG--" "A-CD--GH-" "-B-DEFG-I" "A------H-" "---DE-GHI"
分割后也可以用match
完成
lst <- strsplit(v1, "")
mx <- match(max(sapply(lst, tail, 1)), LETTERS)
sapply(lst, function(x) paste(replace_na(x[match(LETTERS[seq_len(mx)],
x)], '-'), collapse=""))
v1 <- c("ABCDEFG", "ACDGH", "BDEFEGI", "AH", "DEGHI")
答案 1 :(得分:1)
我建议您使用MAFFT sequence alignment。通常,它用于比对生物序列,但是它可以选择使用--anysymbol来比对文本。请注意,MAFFT是bash脚本,需要输入/输出文件。
输入文件(mafft_anysymbol_input.txt):
>Seq1
ABCDEFG
>Seq2
ACDGH
>Seq3
BDEFEGI
>Seq4
AH
>Seq5
DEGHI
运行bash脚本的R代码:
#Be sure that input/output and R files share the same path, otherwise you'll have to specify the path in the mafft script call.
x <- 'mafft --anysymbol mafft_anysymbol_input.txt > mafft_anysymbol_output.txt'
system(x)
输出文件的内容(mafft_anysymbol_output.txt):
>Seq1
ABCDEFG--
>Seq2
-ACDGH---
>Seq3
--BDEFEGI
>Seq4
----AH---
>Seq5
---DEGHI-
编辑-现在,我知道您熟悉生物比对工具。如果要为文本对齐方式创建自定义的得分矩阵,请查看mafft选项--text and --textmatrix。它需要输入ascii代码(额外的数据类型转换),但是您可以选择按分数将相似的字母(但是您选择定义相似的字母)相关联。例如,您可以将大小写字母或带有/不带有重音符号的字母关联起来。