#r #string #replace
#r #строка #заменить
Вопрос:
Мне нужно заменить в строке foo bar foo bar bar foo
все foo
на bar
и все bar
на foo
. Таким образом, результат должен выглядеть bar foo bar foo foo bar
следующим образом.
Я пробовал этот способ:
library(stringr)
my_str <- "foo bar foo bar bar foo"
rslt <- str_replace_all(my_str, c("foo", "bar"), c("bar", "foo"))
print(rslt)
но вместо этого я получил "bar bar bar bar bar bar" "foo foo foo foo foo foo"
.
Вопрос: Как исправить мой код, чтобы я понял bar foo bar foo foo bar
?
Ответ №1:
Использование str_replace_all
нескольких замен и перемещение первого совпадения во временное значение.
library(stringr)
str_replace_all(my_str, c("foo" = "tmp", "bar" = "foo", "tmp" = "bar"))
[1] "bar foo bar foo foo bar"
Ответ №2:
Нет реальной причины для этого, если вы не можете установить дополнительные пакеты, но просто для развлечения вот базовое решение R (следуя методу замены «tmp» в ответе @manotheshark):
Reduce(
function(prev, x) gsub(x[1], x[2], prev),
list(c('foo', 'tmp'), c('bar', 'foo'), c('tmp', 'bar')),
my_str)
# [1] "bar foo bar foo foo bar"
Ответ №3:
Вариант split
— заменить и
str_c(setNames(v1, rpl)[str_split(my_str, "\s ")[[1]]], collapse = ' ')
#[1] "bar foo bar foo foo bar"
Или другой вариант gsubfn
library(gsubfn)
gsubfn("(\w )", setNames(as.list(v1), rpl), my_str)
#[1] "bar foo bar foo foo bar"