Une autre alternative consiste à utiliser la capture de sous-expressions avec les fonctions d'expression régulière regmatches
et regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Cela renvoie la chaîne entière, le premier caractère et le résultat "popped" dans une liste de longueur 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
ce qui équivaut à list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Autrement dit, il contient le super ensemble des éléments souhaités ainsi que la chaîne complète.
L'ajout sapply
permettra à cette méthode de fonctionner pour un vecteur de caractères de longueur> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Cela renvoie une liste avec la chaîne complète correspondante comme premier élément et les sous-expressions correspondantes capturées par ()
les éléments suivants. Donc, dans l'expression régulière '(^.)(.*)'
, (^.)
correspond au premier caractère et (.*)
correspond aux caractères restants.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Maintenant, nous pouvons utiliser la méthode trusty sapply
+ [
pour extraire les sous-chaînes souhaitées.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
pour l'extraction. "sauter" le premier caractère, comme spécifié dans la question, consiste à répéter ce processus sur le vecteur résultant (mySecondStrings).