Другой альтернативой является использование захвата подвыражений с функциями регулярного выражения regmatches
и regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Это возвращает всю строку, первый символ и "вытянутый" результат в виде списка длиной 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
что эквивалентно list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. То есть он содержит супернабор желаемых элементов, а также полную строку.
Добавление sapply
позволит этому методу работать для вектора символов длиной> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Это возвращает список с совпавшей полной строкой в качестве первого элемента и совпадающими подвыражениями, захваченными в ()
качестве следующих элементов. Таким образом , в регулярном выражении '(^.)(.*)'
, (^.)
соответствует первому символу и (.*)
соответствует оставшиеся символы.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Теперь мы можем использовать метод trusty sapply
+ [
для извлечения нужных подстрок.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
для извлечения. "выталкивание" первого символа, как указано в вопросе, заключается в повторении этого процесса для результирующего вектора (mySecondStrings).