【问题标题】:Efficient String Search and Replace高效的字符串搜索和替换
【发布时间】:2015-11-18 05:06:05
【问题描述】:

我正在尝试清理包含职位名称的数据库中的大约 200 万个条目。许多人有几个缩写,我希望将它们更改为一个一致且更易于搜索的选项。到目前为止,我只是使用单独的mapply(gsub(...) 命令来浏览该列。但是我要进行大约 80 处更改,因此运行大约需要 30 分钟。 必须有更好的方法。我是字符串搜索的新手,我发现了 *$ 技巧,这很有帮助。有没有办法在单个mapply 中进行多次搜索?我想可能更快? 任何帮助都会很棒。谢谢。

下面是一些代码。测试是一列包含 200 万个个人职位的列。

test <- mapply(gsub, " Admin ", " Administrator ", test)
test <- mapply(gsub, "Admin ", "Administrator ", test)
test <- mapply(gsub, " Admin*$", " Administrator", test)
test <- mapply(gsub, "Acc ", " Accounting ", test)
test <- mapply(gsub, " Admstr ", " Administrator ", test)
test <- mapply(gsub, " Anlyst ", " Analyst ", test)
test <- mapply(gsub, "Anlyst ", "Analyst ", test)
test <- mapply(gsub, " Asst ", " Assistant ", test)
test <- mapply(gsub, "Asst ", "Assistant ", test)
test <- mapply(gsub, " Assoc ", " Associate ", test)
test <- mapply(gsub, "Assoc ", "Associate ", test)

【问题讨论】:

标签: regex r performance data-cleaning


【解决方案1】:

一种选择是使用来自library(qdap)mgsub

mgsub(patternVec, replaceVec, test)

数据

patternVec <- c(" Admin ", "Admin ")
replaceVec <- c(" Administrator ",  "Administrator ")

【讨论】:

  • @DickMcManus 使用 stringi 库可能值得尝试基本相同的事情,它应该非常有效:stri_replace_first_regex(test, patternVec, replaceVec)
  • @Jota - 一项快速测试表明,stri 将比仅使用 for 循环快约 1.5 倍,这应该比这里的任何其他方法都快。
【解决方案2】:

这是一个有效的基本 R 解决方案。您可以定义一个包含所有模式及其替换的数据框。然后你在行模式下使用apply() 并在你的test 向量上为每个模式/替换组合调用gsub()。这是演示此的示例代码:

df <- data.frame(pattern=c(" Admin ", "Admin "),
                 replacement=c(" Administrator ", "Administrator "))

test <- c(" Admin ", "Admin ")

apply(df, 1, function(x) {
                test <<- gsub(x[1], x[2], test)
             })

> test
[1] " Administrator " "Administrator " 

【讨论】:

  • @thelatemail 我从未见过这篇文章,也没有使用 SO 来生成我的答案。
  • 我并不是建议您这样做(或者您根本没有做任何不愉快的事情)- 只是链接一个旧帖子,以便将问题联系在一起。
  • 酷...不用担心...感谢您添加此信息。
  • @thelatemail 我一回答就注意到了你的评论,哈哈。我在您提供的链接中有类似的答案。
  • @hwnd - :-D - 我想现在唯一的问题是stri_replace.... 函数是否会大大加快速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多