[英]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 中的解决方案:
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 包于 2022-05-25 创建 (v2.0.1)
一个解决方案是使用 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 -
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.