str_replace_all заменяет символ, который уже был заменен - PullRequest
0 голосов
/ 10 октября 2018

Я проверяю функцию str_replace_all в пакете stringr.Пожалуйста, смотрите код ниже.

library(stringr) 
originalString<-c("d", "a", "c")
patternColor=c("coral", "burlywood1", "darkkhaki")
names(patternColor)<-originalString
subsetColNameChar<-c("d", "d", "a", "a", "c", "c")
replaceOut<-str_replace_all(subsetColNameChar, patternColor)
replaceOut
[1] "darkkhakiorburlywood1l" "darkkhakiorburlywood1l" "burlywood1" "burlywood1"  "darkkhaki"  "darkkhaki" 

Ожидаемый результат должен быть:

[1] "coral" "coral" "burlywood1" "burlywood1" "darkkhaki" "darkkhaki" 

Но, как вы видите выше, он заменяет «c» и «a» в «коралле» на «darkkhaki»и снова «burlywood1».(Если вы видите это внимательно, все еще остаются «или» и «l»).Если бы я использовал только число в originalString<-c("1","2","3"), я мог бы получить правильную замену, как я ожидаю.Но я не знаю, почему str_replace_all снова заменяет "c" и "a" в "коралле", которые уже заменены.Как можно решить эту проблему?

1 Ответ

0 голосов
/ 10 октября 2018

str.replace векторизовано над строкой, шаблоном и заменой.Это означает, что он ищет первый шаблон в первой строке, и если он его находит, применяет первую замену, затем переходит ко второй строке, ищет второй шаблон (только) и, если он находит, применяет второйзамена и т. д.

Когда вы передаете именованный вектор в качестве шаблона в str.replace.all, он зацикливает весь вектор шаблона на каждом строковом элементе, давая вам результат, который вы видели.

Одна альтернативавы можете считать это qdap::multigsub, что в основном соответствует названию: множественные gsub grep-and-replaces:

multigsub(originalString, patternColor, subsetColNameChar)
...