Найти все возможные подстроки длины n, используя разделитель - PullRequest
2 голосов
/ 26 июня 2019

Я столкнулся с проблемой, подобной Найти все возможные подстроки длины n .Однако вместо того, чтобы находить все возможные подстроки на символьной основе, я хочу разделить слова, используя такой разделитель, как подчеркивание.

Например:

"423.A_425.A_429.B_440.A_480.C_502.B"

Из этого я хочу извлечь следующие шаблоны, используя n=3:

'423.A_425.A_429.B', '425.A_429.B_440.A', '429.B_440.A_480.C', '440.A_480.C_502.B'

И с n=4, подстрокидолжно стать:

'423.A_425.A_429.B_440.A', '425.A_429.B_440.A_480.C', '429.B_440.A_480.C_502.B'

Я попытался адаптировать решение Юлиуса Вайнора (см. ниже), чтобы использовать шаблоны между подчеркиванием вместо разделения по символам, но пока не повезло:

allsubstr <- function(x, n) unique(substring(x, 1:(nchar(x) - n + 1), n:nchar(x)))

Тогда я получаюв качестве вывода (используя n=3):

"423" "23." "3.A" ".A_" "A_4" "_42" "425" "25." "5.A" "429" "29." "9.B" ".B_" "B_4" "_44" "440" "40." "0.A" "_48" "480" "80." "0.C" ".C_" "C_5" "_50" "502" "02." "2.B"

Что может быть альтернативой?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Мы можем split на _ и использовать combn, чтобы найти все возможные подстроки, а затем paste

combn(unlist(strsplit(v1, "_")), 3, FUN = paste, collapse="_")
0 голосов
/ 26 июня 2019

Похоже, что OP хочет только комбинации, имеющие тот же порядок, что и в исходной строке.

v <- "423.A_425.A_429.B_440.A_480.C_502.B"

allsubstr <- function(string, size, delim) {
  vec_string <- unlist(strsplit(string, delim))

  if(size < 1 || size > length(vec_string))
    stop("size must be element of [1, ", length(vec_string), "]")

  if(size == 1)
    return(vec_string)

  idxs <- cbind(start = size:length(vec_string) - size + 1, 
                end = size:length(vec_string))
  mx <- apply(idxs, 1, function(i, s, d) s[c(i["start"]:i["end"])], s = vec_string, d = delim)
  apply(mx, 2, paste, collapse = delim)
}

Тогда мы можем сделать:

> allsubstr(v, 0, "_")
Error in allsubstr(v, 0, "_") : size must be element of [1, 6]

> allsubstr(v, 3, "_")
[1] "423.A_425.A_429.B" "425.A_429.B_440.A" "429.B_440.A_480.C" "440.A_480.C_502.B"

> allsubstr(v, 4, "_")
[1] "423.A_425.A_429.B_440.A" "425.A_429.B_440.A_480.C" "429.B_440.A_480.C_502.B"

> allsubstr(v, 7, "_")
Error in allsubstr(v, 7, "_") : size must be element of [1, 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...