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"
sapply
für die Extraktion verwendet wird. Beim "Poppen" des ersten Zeichens, wie in der Frage angegeben, wird dieser Vorgang für den resultierenden Vektor (mySecondStrings) wiederholt.