Как разбить строку на подстроки заданной длины?

У меня есть строка, такая как:

"aabbccccdd"

Я хочу разбить эту строку на вектор подстрок длиной 2:

"aa" "bb" "cc" "cc" "dd"

Вот один из способов

 substring("aabbccccdd", seq(1, 9, 2), seq(2, 10, 2)) #[1] "aa" "bb" "cc" "cc" "dd" 

или в целом

 text <- "aabbccccdd" substring(text, seq(1, nchar(text)-1, 2), seq(2, nchar(text), 2)) #[1] "aa" "bb" "cc" "cc" "dd" 

Изменить: это намного, намного быстрее

 sst <- strsplit(text, "")[[1]] out <- paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)]) 

Он сначала разбивает строку на символы. Затем он объединяет четные элементы и нечетные элементы.

Задержки

 text <- paste(rep(paste0(letters, letters), 1000), collapse="") g1 <- function(text) { substring(text, seq(1, nchar(text)-1, 2), seq(2, nchar(text), 2)) } g2 <- function(text) { sst <- strsplit(text, "")[[1]] paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)]) } identical(g1(text), g2(text)) #[1] TRUE library(rbenchmark) benchmark(g1=g1(text), g2=g2(text)) # test replications elapsed relative user.self sys.self user.child sys.child #1 g1 100 95.451 79.87531 95.438 0 0 0 #2 g2 100 1.195 1.00000 1.196 0 0 0 
 string <- "aabbccccdd" # total length of string num.chars <- nchar(string) # the indices where each substr will start starts <- seq(1,num.chars, by=2) # chop it up sapply(starts, function(ii) { substr(string, ii, ii+1) }) 

Который дает

 [1] "aa" "bb" "cc" "cc" "dd" 

Есть две простые возможности:

 s <- "aabbccccdd" 
  1. gregexpr и regmatches :

     regmatches(s, gregexpr(".{2}", s))[[1]] # [1] "aa" "bb" "cc" "cc" "dd" 
  2. strsplit :

     strsplit(s, "(?<=.{2})", perl = TRUE)[[1]] # [1] "aa" "bb" "cc" "cc" "dd" 

Для группировки символов можно использовать матрицу:

 s2 <- function(x) { m <- matrix(strsplit(x, '')[[1]], nrow=2) apply(m, 2, paste, collapse='') } s2('aabbccddeeff') ## [1] "aa" "bb" "cc" "dd" "ee" "ff" 

К сожалению, это прерывается для ввода нечетной длины строки, давая предупреждение:

 s2('abc') ## [1] "ab" "ca" ## Warning message: ## In matrix(strsplit(x, "")[[1]], nrow = 2) : ## data length [3] is not a sub-multiple or multiple of the number of rows [2] 

Более неудачным является то, что g1 и g2 из @GSee молча возвращают неверные результаты для ввода длины нечетной строки:

 g1('abc') ## [1] "ab" g2('abc') ## [1] "ab" "cb" 

Здесь функция в духе s2, принимая параметр для количества символов в каждой группе и при необходимости оставляя последнюю запись коротким:

 s <- function(x, n) { sst <- strsplit(x, '')[[1]] m <- matrix('', nrow=n, ncol=(length(sst)+n-1)%/%n) m[seq_along(sst)] <- sst apply(m, 2, paste, collapse='') } s('hello world', 2) ## [1] "he" "ll" "o " "wo" "rl" "d" s('hello world', 3) ## [1] "hel" "lo " "wor" "ld" 

(Это действительно медленнее, чем g2 , но быстрее, чем g1 примерно в 7 раз)

Уродливый, но работает

 sequenceString <- "ATGAATAAAG" J=3#maximum sequence length in file sequenceSmallVecStart <- substring(sequenceString, seq(1, nchar(sequenceString)-J+1, J), seq(J,nchar(sequenceString), J)) sequenceSmallVecEnd <- substring(sequenceString, max(seq(J, nchar(sequenceString), J))+1) sequenceSmallVec <- c(sequenceSmallVecStart,sequenceSmallVecEnd) cat(sequenceSmallVec,sep = "\n") 

Дает ATG AAT AAA G

  • Проверьте, содержит ли строка другую строку
  • Удалить символы после определенного символа в строке, а затем удалить подстроку?
  • Используйте Java и RegEx для преобразования оболочки в строку
  • Как использовать переменные в одиночных кавычках?
  • как проверить начало строки в C ++
  • Что именно делает метод .join ()?
  • Есть ли способ создать строку из массива utf16 в swift?
  • Число регулярных выражений от 1 до 100
  • Escape curly brace '{' в String.Format
  • Как эффективно конкатенировать строки в Go?
  • Bash: разделите строку на массив символов
  • Давайте будем гением компьютера.