Давайте начнем с создания некоторых данных:
set.seed(1)
data <- lapply(1:3, function(i) sample(LETTERS[1:3], rpois(1, 6), re = T))
data <- sapply(data, paste, collapse = ">")
data
#> [1] "B>B>C>A" "C>B>B>A>A>A>C>B>C" "C>C>B>C>C>A"
Учитывая проблему, имеет смысл рассматривать эти данные как список векторов, которые мы получаем после разделения элементов по разделителю >
:
strsplit(data, ">")
#> [[1]]
#> [1] "B" "B" "C" "A"
#>
#> [[2]]
#> [1] "C" "B" "B" "A" "A" "A" "C" "B" "C"
#>
#> [[3]]
#> [1] "C" "C" "B" "C" "C" "A"
Теперь суть проблемы заключается в том, чтобы найти все последовательные последовательности заданной длины из одного вектора.Как только мы сможем это сделать, просто применить к списку данных, которые у нас есть;преобразование обратно в формат с разделителями также будет простым.
Учитывая эту цель, мы можем затем создать функцию для извлечения последовательностей;здесь мы просто зацикливаемся на каждом элементе и извлекаем все последовательности заданной длины в список:
seqs <- function(x, length = 2) {
if (length(x) < length)
return(NULL)
k <- length - 1
lapply(seq_len(length(x) - k), function(i) x[i:(i + k)])
}
Теперь мы можем просто применить функцию к данным после разделения символов с разделителями на векторы, чтобы получить результат.Нам также понадобится дополнительный sapply
с paste
для преобразования данных обратно в формат с разделителями, с которого мы начали:
lapply(strsplit(data, ">"), function(x) {
sapply(seqs(x, 3), paste, collapse = ">")
})
#> [[1]]
#> [1] "B>B>C" "B>C>A"
#>
#> [[2]]
#> [1] "C>B>B" "B>B>A" "B>A>A" "A>A>A" "A>A>C" "A>C>B" "C>B>C"
#>
#> [[3]]
#> [1] "C>C>B" "C>B>C" "B>C>C" "C>C>A"
Далее, чтобы получить последовательности нескольких длин одновременно, мы можем добавить еще один слой итерации:
lapply(strsplit(data, ">"), function(x) {
unlist(sapply(c(2, 3), function(n) {
sapply(seqs(x, n), paste, collapse = ">")
}))
})
#> [[1]]
#> [1] "B>B" "B>C" "C>A" "B>B>C" "B>C>A"
#>
#> [[2]]
#> [1] "C>B" "B>B" "B>A" "A>A" "A>A" "A>C" "C>B" "B>C"
#> [9] "C>B>B" "B>B>A" "B>A>A" "A>A>A" "A>A>C" "A>C>B" "C>B>C"
#>
#> [[3]]
#> [1] "C>C" "C>B" "B>C" "C>C" "C>A" "C>C>B" "C>B>C" "B>C>C" "C>C>A"
Создан в 2018-05-21 с помощью пакета Представить (v0.2.0).