Hier sind einige Lösungen. Sie funktionieren auch dann, wenn string
ein Zeichenvektor von Strings ist, in welchem Fall Substitutionen für jede Komponente davon durchgeführt werden.
1) Reduzieren Dies verwendet keine Pakete.
Reduce(function(x, i) gsub(paste0("\\b", a[i], "\\b"), b[i], x), seq_along(a), string)
## [1] "that was a story about a boy"
2) gsubfngsubfn
ist wie gsub
aber der Ersatz Argument kann eine Liste von Ersetzungen (oder bestimmte andere Objekte sein).
library(gsubfn)
gsubfn("\\w+", setNames(as.list(b), a), string)
## [1] "that was a story about a boy"
3) loop Dies ist nicht vektorisiert sondern zum Vergleich hinzugefügt. Keine Pakete werden verwendet.
out <- string
for(i in seq_along(a)) out <- gsub(paste0("\\b", a[i], "\\b"), b[i], out)
out
## [1] "that was a story about a boy"
Hinweis: Es gibt einige Frage, ob Zyklen möglich. wenn
Zum Beispiel
a <- c("a", "A")
b <- rev(a)
wollen wir
- "a" mit "A" ersetzt werden und dann wieder auf "a" wieder, oder
- "a" und "A" ausgetauscht werden.
Alle oben gezeigten Lösungen nehmen den ersten Fall an. Wenn wir den zweiten Fall wollten, dann führe die Operation zweimal durch.Wir werden zeigen, mit (2), weil es die kürzeste, aber die gleiche Idee gilt für sie alle:
# swap "a" and "A"
a <- c("a", "A")
b <- rev(a)
tmp <- gsubfn("\\w+", setNames(as.list(seq_along(a)), a), string)
gsubfn("\\w+", setNames(as.list(b), seq_along(a)), tmp)
## [1] "this is A story about A test"
Nice! Ich war noch nicht Reduce ausgesetzt. Danke vielmals. – hjms
Fügen Sie einen Hinweis zu den Zyklen hinzu –
Auch 'regmatches (string, gregexpr (einfügen (a, collapse =" | "), string)) <- list (b)' funktioniert ähnlich wie 'gsubfn' – thelatemail