Outra alternativa é usar a captura de subexpressões com as funções de expressão regular regmatches
e regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Isso retorna a string inteira, o primeiro caractere e o resultado "exibido" em uma lista de comprimento 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
que é equivalente a list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Ou seja, ele contém o superconjunto dos elementos desejados, bem como a string inteira.
Adicionar sapply
permitirá que esse método funcione para um vetor de caracteres de comprimento> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Isso retorna uma lista com a string completa correspondente como o primeiro elemento e as subexpressões correspondentes capturadas por ()
como os seguintes elementos. Portanto, na expressão regular '(^.)(.*)'
, (^.)
corresponde ao primeiro caractere e (.*)
aos caracteres restantes.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Agora, podemos usar o método trusty sapply
+ [
para extrair as substrings desejadas.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
para a extração. "popping" o primeiro caractere, conforme especificado na pergunta, é uma questão de repetir esse processo no vetor resultante (mySecondStrings).