在一长串字符中找到最长的重复单词
Finding the longest stretch of repeated words in a long string of characters
我有一个带有字符 (ATCG) 的长 DNA 序列文本文件。我正在寻找 R 中的一些方法,可以用来找到最长的重复单词。可以说我的字符串看起来像,
AAGTGCGGGTTCAGATCGCCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA
我需要可能带有计数的输出,
啊啊啊啊啊啊啊啊啊
n=16
请帮我解决这个问题。
也许你可以试试这个
> s <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
> v <- regmatches(s, gregexpr("(.)\1+", s))[[1]]
> v[which.max(nchar(v))]
[1] "AAAAAAAAAAAAAAAA"
首先形成所有相同碱基对子串的向量。然后,找到该向量中最长的字符串。
x <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
parts <- unlist(strsplit(x, "(?<=([ACGT]))(?!\1)"))
parts[order(-nchar(parts), parts)][1]
[1] "AAAAAAAAAAAAAAAA"
如果你有一个字符串:
library(tidyverse)
string <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
x <- str_extract_all(string, "(.)\1+")
x[which.max(nchar(x))]
[1] "AAAAAAAAAAAAAAAA"
如果你有很多字符串:
str_extract_all(c(string, string), "(.)\1+")%>%
map_chr(~.x[which.max(nchar(.x))])
[1] "AAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAA"
要查找计数,只需使用 nchar
甚至 str_count
结果
另一个可能的解决方案:
library(tidyverse)
s <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
data.frame(seq = str_extract_all(s, "([A-Z])\1{2,}") %>% unlist) %>%
mutate(n = str_count(seq)) %>%
slice_max(n, n = 1)
#> seq n
#> 1 AAAAAAAAAAAAAAAA 16
我有一个带有字符 (ATCG) 的长 DNA 序列文本文件。我正在寻找 R 中的一些方法,可以用来找到最长的重复单词。可以说我的字符串看起来像, AAGTGCGGGTTCAGATCGCCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA
我需要可能带有计数的输出, 啊啊啊啊啊啊啊啊啊 n=16
请帮我解决这个问题。
也许你可以试试这个
> s <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
> v <- regmatches(s, gregexpr("(.)\1+", s))[[1]]
> v[which.max(nchar(v))]
[1] "AAAAAAAAAAAAAAAA"
首先形成所有相同碱基对子串的向量。然后,找到该向量中最长的字符串。
x <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
parts <- unlist(strsplit(x, "(?<=([ACGT]))(?!\1)"))
parts[order(-nchar(parts), parts)][1]
[1] "AAAAAAAAAAAAAAAA"
如果你有一个字符串:
library(tidyverse)
string <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
x <- str_extract_all(string, "(.)\1+")
x[which.max(nchar(x))]
[1] "AAAAAAAAAAAAAAAA"
如果你有很多字符串:
str_extract_all(c(string, string), "(.)\1+")%>%
map_chr(~.x[which.max(nchar(.x))])
[1] "AAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAA"
要查找计数,只需使用 nchar
甚至 str_count
结果
另一个可能的解决方案:
library(tidyverse)
s <- "AAGTGCGGGTTCAGATCGCCCCCCCATCGGGCAAAAAAAAAAAAAAAATCGA"
data.frame(seq = str_extract_all(s, "([A-Z])\1{2,}") %>% unlist) %>%
mutate(n = str_count(seq)) %>%
slice_max(n, n = 1)
#> seq n
#> 1 AAAAAAAAAAAAAAAA 16