Разбивает строку на подстроки заданной длины с остатком

учитывая строку, такую как:

text <- "abcdefghijklmnopqrstuvwxyz"

Я хотел бы нарезать строку на подстроки, например length 10, и сохранить остаток:

"abcdefghij"
"klmnopqrst"
"uvwxyz"

все методы, которые я знаю для создания подстрок, не дадут мне оставшуюся подстроку с 6 символами. Я пробовал ответы из предыдущих подобных вопросов, таких как:

> substring(text, seq(1, nchar(text), 10), seq(10, nchar(text), 10))
[1] "abcdefghij" "klmnopqrst" ""  

любые советы о том, как получить все подстроки желаемой длины и любые оставшиеся строки, будут много оцененный.

3 ответов


векторы, которые вы используете для first и last аргументы substring может превышать количество символов в строке без ошибок/предупреждения/проблемы. Так что вы можете сделать

text <- "abcdefghijklmnopqrstuvwxyz"

sq <- seq.int(to = nchar(text), by = 10)
substring(text, sq, sq + 9)
# [1] "abcdefghij" "klmnopqrst" "uvwxyz"   

попробовать

strsplit(text, '(?<=.{10})', perl=TRUE)[[1]]
#[1] "abcdefghij" "klmnopqrst" "uvwxyz" 

или вы можете использовать library(stringi) для более быстрого подхода

library(stringi)
stri_extract_all_regex(text, '.{1,10}')[[1]]
#[1] "abcdefghij" "klmnopqrst" "uvwxyz"    

вот способ, с помощью strapplyc С использованием довольно простого регулярного выражения. Это работает, потому что .{1,10} всегда соответствует самой длинной строке, которая не превышает 10 символов:

library(gsubfn)
strapplyc(text, ".{1,10}", simplify = c)

даем:

[1] "abcdefghij" "klmnopqrst" "uvwxyz"

визуализация это регулярное выражение достаточно просто, что оно действительно не требует визуализации, но в любом случае:

.{1,10}

Debuggex Demo