【问题标题】:How to index and gsub a string within a dataframe using regex in R如何在 R 中使用正则表达式在数据框中索引和 gsub 字符串
【发布时间】:2021-06-10 06:38:32
【问题描述】:

我正在研究一个文本清理管道,我希望将数据框中的目标词列表和相应的替换词应用于给定的字符串(例如,山羊) goats <- c("goats like apples applesauce. goats like bananas bananasplits. goats like cheese cheesecake.")

我正在使用 for 循环来运行目标列表和 gsub,并在指定的文本(山羊)中使用它们的相应替换。我希望替换只捕获精确的字符串匹配(例如,banana 但不是bananasplit)。这是循环:

goatclean <- goats
for (i in seq_along(swap$target)) {
    goatclean <- gsub(swap$target[i], swap$replace[i], goatclean)
}
print(goatclean)

这个循环的输出是: “山羊喜欢玛丽玛丽亚斯。山羊喜欢琳达林达普利茨。山羊喜欢简简蛋糕。”

当它只是一个使用正则表达式的孤立词时,我无法从数据帧中找出 gsub 'apples' 的方法——当我将 \s+ 添加到时出现错误:

gsub(\\s+(swap$target[i])\\s+, swap$replace[i], goatclean)

关于如何获得以下输出的任何建议: “山羊喜欢玛丽苹果酱。山羊喜欢琳达香蕉皮。山羊喜欢简芝士蛋糕。”

谢谢大家!

【问题讨论】:

  • gsub(sprintf('\\b(%s)\\b', swap$target[i]), swap$replace[i], goatclean)。虽然这似乎是一个矢量化问题。可以有比 for 循环更好的代码。可能如果您包含交换数据集
  • 为了回应@Onyambu 的评论,stringr::str_replace_allstringpatternreplacement 上被矢量化,所以我希望这可以在一行中实现,而无需循环。对于大型数据集,这应该比循环快很多
  • 我试了一下:maybe &lt;- str_replace_all(goats, swap$target, swap$replace) 但不行。输出是:“山羊喜欢玛丽玛丽酱。山羊喜欢香蕉香蕉片。山羊喜欢奶酪芝士蛋糕。”

标签: r regex


【解决方案1】:

尝试在模式周围使用单词边界 (\\b) -

for (i in seq_along(swap$target)) {
  goatclean <- gsub(paste0('\\b', swap$target[i], '\\b'), swap$replace[i], goatclean)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多