Otra alternativa es utilizar la captura de sub-expresiones con las funciones de expresión regular regmatches
y regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Esto devuelve la cadena completa, el primer carácter y el resultado "emergente" en una lista de longitud 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
que es equivalente a list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Es decir, contiene el superconjunto de los elementos deseados, así como la cadena completa.
Agregar sapply
permitirá que este método funcione para un vector de caracteres de longitud> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Esto devuelve una lista con la cadena completa coincidente como primer elemento y las subexpresiones coincidentes capturadas por ()
como los siguientes elementos. Entonces, en la expresión regular '(^.)(.*)'
, (^.)
coincide con el primer carácter y (.*)
coincide con los caracteres restantes.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Ahora, podemos usar el método trusty sapply
+ [
para extraer las subcadenas deseadas.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
para la extracción. "hacer estallar" el primer carácter, como se especifica en la pregunta, es una cuestión de repetir este proceso en el vector resultante (mySecondStrings).