【问题标题】:str_replace_all is replacing character which was replaced alreadystr_replace_all 正在替换已经替换的字符
【发布时间】:2018-10-10 17:29:29
【问题描述】:

我正在测试stringr 包中的str_replace_all 函数。请看下面的代码。

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" 

但是,正如您在上面看到的输出,它再次将“coral”中的“c”和“a”替换为“darkkhaki”和“burlywood1”。 (仔细看,还剩下“or”和“l”)。如果我只使用 originalString&lt;-c("1","2","3") 中的数字,我可以得到正确的替换,如我所料。但是,我不知道为什么str_replace_all 再次替换“珊瑚”中的“c”和“a”,它们已经被替换了。有什么办法可以解决这个问题?

【问题讨论】:

  • 来自 str_replace 的文档:“要在字符串的每个元素中执行多个替换,请将命名向量 (c(pattern1 = replacement1)) 传递给 str_replace_all。”。也就是说,str_replace中需要有一个未命名的模式向量和一个未命名的替换向量
  • 你必须检查函数是如何工作的。试试str_replace_all(subsetColNameChar, c("c"="darkkhaki", "a"="burlywood1", "d"="coral"))str_replace_all(subsetColNameChar, c("d"="coral", "a"="burlywood1", "c"="darkkhaki")) 这两个版本,你会发现它是按顺序工作的。这就是为什么有些模式会再次被替换。
  • iod,谢谢您的解释。你说的对。我传递了命名模式向量,因为我想通过 str_replace_all 执行多次替换。
  • AntoniosK,谢谢你的回答。我运行了您提供的两个版本,并且理解得更好。

标签: r str-replace


【解决方案1】:

str.replace 通过字符串、模式和替换向量化。意思是,它在第​​一个字符串中搜索第一个模式,如果找到,应用第一个替换,然后移动到第二个字符串,(仅)查找第二个模式,如果找到,应用第二个更换等。

当您将命名向量作为模式传递给str.replace.all 时,它会将整个模式向量循环到每个字符串元素上,从而为您提供所看到的结果。

您可能会考虑的另一种选择是qdap::multigsub,它基本上就像名字所说的那样:多个 gsub grep-and-replaces:

multigsub(originalString, patternColor, subsetColNameChar)

【讨论】:

  • 感谢您,我了解到 str_replace_all 将整个模式向量循环到每个字符串元素上。顺便说一句,我测试了你的代码,'multigsub'函数,但它仍然不起作用; [5] “coralburlywoocoral1rkkhburlywoocoral1ki” [6] “coralburlywoocoral1rkkhburlywoocoral1ki”
  • 嗯...是的,我明白了。我想这真的取决于你想要达到的目标。例如,是否可以将模式向量替换为 c("^a$", "^b$") 之类的东西,以便它只匹配完整的字符串?
  • 哦,我明白了。我输入了 originalString
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2016-06-12
  • 2018-07-13
  • 2023-03-06
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多