如何在 R 中对文本字符串 (utf8) 进行多序列对齐

How to do multiple sequence alignment of text strings (utf8) in R

给定三个字符串:

seq <- c("abcd", "bcde", "cdef", "af", "cdghi")

我想进行多序列比对,以便得到以下结果:

abcd
 bcde
  cdef
a    f
  cd  ghi

使用我尝试过的 msa 包中的 msa() 函数:

msa(seq, type = "protein", order = "input", method = "Muscle")

得到以下结果:

    aln     names
 [1] ABCD--- Seq1
 [2] -BCDE-- Seq2
 [3] --CD-EF Seq3
 [4] -----AF Seq4
 [5] --CDGHI Seq5
 Con --CD-?? Consensus   

我想将此函数用于可包含任何 unicode 字符的序列,但在此示例中该函数已发出警告:找到无效字母。有什么想法吗?

这是一个基于 R 的解决方案,输出 table:

seq <- c("abcd", "bcde", "cdef", "af", "cdghi")

all_chars <- unique(unlist(strsplit(seq, "")))

tab <- t(apply(do.call(rbind, lapply(strsplit(seq, ""), 
       function(x) table(factor(x, all_chars)))), 1,
       function(x) ifelse(x == 1, all_chars, " ")))

我们可以打印不带引号的输出,以便更清楚地查看:

print(tab, quote = FALSE)
#>      a b c d e f g h i
#> [1,] a b c d          
#> [2,]   b c d e        
#> [3,]     c d e f      
#> [4,] a         f      
#> [5,]     c d     g h i

reprex package (v2.0.1)

于 2022-05-25 创建

一个解决方案是使用 LingPy。首先按照位于 http://lingpy.org/tutorial/installation.html 的说明安装 LingPy。然后 运行:

library(reticulate)

builtins <- import_builtins()
lingpy   <- import("lingpy")

seqs <- c("mɪlk","mɔˑlkə","mɛˑlək","mɪlɪx","mɑˑlʲk")

multi <- lingpy$Multiple(seqs)
multi$prog_align()
builtins$print(multi)

输出:

m   ɪ   l   -   k   -
m   ɔˑ  l   -   k   ə
m   ɛˑ  l   ə   k   -
m   ɪ   l   ɪ   x   -
m   ɑˑ  lʲ  -   k   -