Іншою альтернативою є використання захоплення підвиразів за допомогою функцій регулярного вираження 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"