对齐两个列表中的许多短序列并找到互补

Align many short sequences from two lists and find complementary

所以我在 R 中有两个列表对象,我想知道哪些序列可以通过 DNA 互补性相互结合。

第一个对象rs是反向互补microRNA种子区域,第二个是3'UTRs基序。 关于如何解决这个问题的任何线索?
我找到了一个名为 microRNAs (https://www.bioconductor.org/packages/release/bioc/manuals/microRNA/man/microRNA.pdf) 的包,其中包含一个名为 matchSeeds(seed, seq) 的函数。我这样做了,但这个函数实际上是在寻找精确匹配,这并不是我所需要的。非常感谢任何有关如何在 R 中解决此问题的线索。 谢谢!

> typeof(rs)
[1] "list"
> typeof(u)
[1] "list"

head(rs)
$`miR-92|34108_3p `
[1] "TGCAAT"

$`miR-92|34106_3p `
[1] "TGCAAT"

$`miR-92|34110_3p `
[1] "TGCAAT"

$`miR-184|1952_3p `
[1] "CCGTCC"

$`miR-184|1954_3p `
[1] "CCGTCC"

$`miR-1795_3p `
[1] "CCGTCC"

head(u)
$upper_1
[1] "gccgtt"

$upper_2
[1] "ccgagc"

$upper_3
[1] "gacatt"

$upper_4
[1] "gcttat"

$upper_5
[1] "taccta"

$upper_6
[1] "tcgtct"

如果您想查找 rs 列表中的任何子字符串是否与 u 列表中的字符串互补,并且您希望它具有高性能,您可以使用包 Biostrings 函数 matchPDict.

示例:

library(Biostrings)
library(IRanges)

lis <- list(`miR-92|34108_3p ` = "TGCAAT",
            `miR-92|34106_3p ` = "TGCAAT",
            `miR-92|34110_3p ` = "TGCAAT")

u <- list(upper_1 ="gccgtt",
          upper_2 = "ccgagc",
          upper_3 = "gacatt",
          upper_4 = "gcttat",
          upper_5 = "taccta")

将第一个列表转换为 DNAStringSet:

lis <- DNAStringSetList(lis)
lis <- unlist(lis)

将第二个列表转换为 DNAStringSet:

u <- DNAStringSetList(u)
u <- unlist(u)

得到lis的补码

lis_rc <- complement(lis)

创建一个 PDict,以便您可以快速匹配它与其他列表

pdict0 <- PDict(lis_rc)

遍历列表 u 运行 matchPDict

lapply(u, function(x) matchPDict(pdict0, x))

编辑:如果您想检查任何方向,您可以使用 complementreversereverseComplement 等辅助函数创建它们并将其提供给 PDict

lis_rc <- c(lis,
            complement(lis),
            reverse(lis),
            reverseComplement(lis))

names(lis_rc) <- paste(trimws(names(lis_rc)), rep(c("",
                                            "c",
                                            "r",
                                            "rc"),
                                          each = length(lis)),
                                            sep = "_")

pdict0 <- PDict(lis_rc)

res <- lapply(u, function(x) matchPDict(pdict0, x))

res 是 IRanges 对象的列表

您可以使用

检查匹配的位置
lapply(res, width)
lapply(res, start)
lapply(res, end)

编辑 2:

如果你只想计算没有匹配坐标的匹配,你可以简单地使用:

vcountPDict(pdict0, u)
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    0    0
 [2,]    0    0    0    0    0
 [3,]    0    0    0    0    0
 [4,]    0    0    0    0    0
 [5,]    0    0    0    0    0
 [6,]    0    0    0    0    0
 [7,]    0    0    0    0    0
 [8,]    0    0    0    0    0
 [9,]    0    0    0    0    0
[10,]    0    0    0    0    0
[11,]    0    0    0    0    0
[12,]    0    0    0    0    0

行对应于 pdict0 中的序列,而列对应于 u:

中的序列
mat <- vcountPDict(pdict0, u)
rownames(mat) <- names(lis_rc)
colnames(mat) <- names(u)

                   upper_1 upper_2 upper_3 upper_4 upper_5
miR-92|34108_3p_         0       0       0       0       0
miR-92|34106_3p_         0       0       0       0       0
miR-92|34110_3p_         0       0       0       0       0
miR-92|34108_3p_c        0       0       0       0       0
miR-92|34106_3p_c        0       0       0       0       0
miR-92|34110_3p_c        0       0       0       0       0
miR-92|34108_3p_r        0       0       0       0       0
miR-92|34106_3p_r        0       0       0       0       0
miR-92|34110_3p_r        0       0       0       0       0
miR-92|34108_3p_rc       0       0       0       0       0
miR-92|34106_3p_rc       0       0       0       0       0
miR-92|34110_3p_rc       0       0       0       0       0