处理 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
寻找声明的图案(AAAAAAA 和 TTTTTTT(我想找到所有图案):
table2 <- table %>%
mutate(AAAAAAA = str_locate_all(seq, "AAAAAAA")) %>%
mutate(TTTTTTT = str_locate_all(seq, "TTTTTTT"))
不幸的是,主题的位置只有 start
和 end
:
# 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
,然后填充 start
和 end
之间的位置:
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)
我在字符序列中寻找图案。一旦找到它们,我想绘制一个图,其中包含序列中图案的位置(x - 序列长度(始终为 100),y - 序列给定位置上的图案数量)。
我的想法是创建一个具有 100 列(序列长度)的 table,将在基序位置处填充例如“1”。
我从 table 开始,其中我有序列的 ID,以及包含序列的 seq:
table <- tibble(id = c("AT1", "AT2", "AT3"),
seq = c("AAGCCCATTTAGGGTTTTTTTTAAGCCCAGACCCGGACTCTAATTGCTCCGTATTCTTCTTCTCTTGAGAGGGTTTAAGAGAGAGTTTTTTTGAGAGC",
"AACTTGGCCCAAAAAAAAGCCCATTTAGGGTTAAAACAGTAGCAAAAAAACGGACTCTAATTGCTCCGTATTCTTTAGGGTTTGAGAGATTTTTTTAA",
"GTTTTTTTAGGGTTTAGTTAAAAAAATAGCAGGGTTTAGGACTCTAATTTAGGGTTATTCTTCTTCTCTTGAGAGAGATTTTTTTAGGGTAGAGCTAGCA"))
然后,我使用 str_locate_all
寻找声明的图案(AAAAAAA 和 TTTTTTT(我想找到所有图案):
table2 <- table %>%
mutate(AAAAAAA = str_locate_all(seq, "AAAAAAA")) %>%
mutate(TTTTTTT = str_locate_all(seq, "TTTTTTT"))
不幸的是,主题的位置只有 start
和 end
:
# 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
,然后填充 start
和 end
之间的位置:
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)