在一长串字符中找到最长的重复单词

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