Eine andere Alternative ist die Erfassung von Unterausdrücken mit den Funktionen für reguläre Ausdrücke regmatches
und regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Dies gibt die gesamte Zeichenfolge, das erste Zeichen und das Ergebnis "popped" in einer Liste mit der Länge 1 zurück.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
das ist äquivalent zu list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Das heißt, es enthält die Supermenge der gewünschten Elemente sowie die vollständige Zeichenfolge.
Durch Hinzufügen sapply
kann diese Methode für einen Zeichenvektor mit einer Länge> 1 verwendet werden.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Dies gibt eine Liste mit der übereinstimmenden vollständigen Zeichenfolge als erstem Element und den übereinstimmenden Unterausdrücken zurück, die von ()
den folgenden Elementen erfasst werden . So in dem regulären Ausdruck '(^.)(.*)'
, (^.)
entspricht das erste Zeichen und (.*)
entspricht die restlichen Zeichen.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Jetzt können wir die Trusty sapply
+ [
-Methode verwenden, um die gewünschten Teilzeichenfolgen herauszuziehen.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"