处理 tibble 中 `str_locate_all` 的输出

Deal with the output of `str_locate_all` in tibble

我在字符序列中寻找图案。一旦找到它们,我想绘制一个图,其中包含序列中图案的位置(x - 序列长度(始终为 100),y - 序列给定位置上的图案数量)。

我的想法是创建一个具有 100 列(序列长度)的 table,将在基序位置处填充例如“1”。

我从 table 开始,其中我有序列的 ID,以及包含序列的 seq

table <- tibble(id = c("AT1", "AT2", "AT3"),
                seq = c("AAGCCCATTTAGGGTTTTTTTTAAGCCCAGACCCGGACTCTAATTGCTCCGTATTCTTCTTCTCTTGAGAGGGTTTAAGAGAGAGTTTTTTTGAGAGC",
                        "AACTTGGCCCAAAAAAAAGCCCATTTAGGGTTAAAACAGTAGCAAAAAAACGGACTCTAATTGCTCCGTATTCTTTAGGGTTTGAGAGATTTTTTTAA",
                        "GTTTTTTTAGGGTTTAGTTAAAAAAATAGCAGGGTTTAGGACTCTAATTTAGGGTTATTCTTCTTCTCTTGAGAGAGATTTTTTTAGGGTAGAGCTAGCA"))

然后,我使用 str_locate_all 寻找声明的图案(AAAAAAATTTTTTT(我想找到所有图案):

table2 <- table %>% 
  mutate(AAAAAAA = str_locate_all(seq, "AAAAAAA")) %>%
  mutate(TTTTTTT = str_locate_all(seq, "TTTTTTT")) 

不幸的是,主题的位置只有 startend

# A tibble: 3 x 4
  id    seq                                                                                                  AAAAAAA           TTTTTTT          
  <chr> <chr>                                                                                                <list>            <list>           
1 AT1   AAGCCCATTTAGGGTTTTTTTTAAGCCCAGACCCGGACTCTAATTGCTCCGTATTCTTCTTCTCTTGAGAGGGTTTAAGAGAGAGTTTTTTTGAGAGC   <int[,2] [0 × 2]> <int[,2] [2 × 2]>
2 AT2   AACTTGGCCCAAAAAAAAGCCCATTTAGGGTTAAAACAGTAGCAAAAAAACGGACTCTAATTGCTCCGTATTCTTTAGGGTTTGAGAGATTTTTTTAA   <int[,2] [2 × 2]> <int[,2] [1 × 2]>
3 AT3   GTTTTTTTAGGGTTTAGTTAAAAAAATAGCAGGGTTTAGGACTCTAATTTAGGGTTATTCTTCTTCTCTTGAGAGAGATTTTTTTAGGGTAGAGCTAGCA <int[,2] [1 × 2]> <int[,2] [2 × 2]>

我卡住了,因为我不知道如何从图案列中提取值。我考虑如下创建输出(拆分图案列以分隔 data.frames,然后填充 startend 之间的位置:

AAAAAAA <- matrix(nrow = 3, ncol = 100)
row.names(AAAAAAA) <- c("AT1", "AT2", "AT3")
AAAAAAA[2, c(11:17, 44:50)] <- 1
AAAAAAA[3, c(20:26)] <- 1

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33]
AT1   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT2   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA     1     1     1     1     1     1     1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT3   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA     1     1     1     1     1     1     1    NA    NA    NA    NA    NA    NA    NA
    [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54] [,55] [,56] [,57] [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65]
AT1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT2    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA     1     1     1     1     1     1     1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT3    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
    [,66] [,67] [,68] [,69] [,70] [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] [,80] [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] [,93] [,94] [,95] [,96] [,97]
AT1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT2    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
AT3    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
    [,98] [,99] [,100]
AT1    NA    NA     NA
AT2    NA    NA     NA
AT3    NA    NA     NA

然后我想把所有 table 加入一个大的并使用 ggplot.

制作一个情节

我描述了整个问题,因为我不确定我是否以一种好的方式处理它,并且希望得到任何关于如何“提取”/“简化”str_locate_all 输出的提示或一般提示。

编辑 我预期的最终输出是 table 让我绘制序列长度上所有基序的位置(以查看基序是否分布在例如序列的开头)。

这是一种可能性:

你可以编写一个函数(我称之为 make_vec),它将序列和模式作为输入,returns 矩阵的行。

make_vec <- function(seq, pattern) {
  loc <- str_locate_all(seq, pattern)[[1]]
  res <- integer(100)
  idx <- as.numeric(sapply(loc[,1], function(x) x + seq_len(nchar(pattern)) - 1))
  res[idx] <- 1L
  return(res)
}

接下来您可以对每个序列使用此函数并提取结果:

table3 <- table %>% 
  mutate(
    a = map(seq, make_vec, pattern = "AAAAAAA"),
    t = map(seq, make_vec, pattern = "TTTTTTT"),
  )

  matrix(unlist(table3$a), nrow = 3, byrow = TRUE)