Otra alternativa es utilizar la captura de sub-expresiones con las funciones de expresión regular regmatchesy 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 sapplypermitirá 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"