r - 提高替换多个字符串的性能

标签 r performance foreach parallel-processing gsub

我在原始数据中隐藏了电话号码和个人姓名。我已经问过并得到答案 here表彰我有关电话号码的工作。

在屏蔽个人姓名的情况下,我有以下代码:

x = c("010-1234-5678",
      "John 010-8888-8888",
      "Phone: 010-1111-2222",
      "Peter 018.1111.3333",
      "Year(2007,2019,2020)",
      "Alice 01077776666")

df = data.frame(
  phoneNumber = x
)

delName = c("John", "Peter", "Alice")

for (name in delName) {
  df$phoneNumber <- gsub(name, "anonymous", df$phoneNumber)
}

该代码对我来说不是问题,

> df
              phoneNumber
1           010-1234-5678
2 anonymous 010-8888-8888
3    Phone: 010-1111-2222
4 anonymous 018.1111.3333
5    Year(2007,2019,2020)
6   anonymous 01077776666

但我有超过 10,000 个个人姓名需要隐藏。 R现在正在运行第789个进程。时间可以解决这个问题,但我想知道如何减少处理时间。我搜索了 foreach,但我不知道如何调整上面的原始代码。

最佳答案

这是使用 stringr 的另一个选项,它比 gsub 更快。​​

library(stringr)

str_replace_all(
  string = df$phoneNumber,
  pattern = paste(delName, collapse = '|'),
  replacement = "anonymous"
)

# [1] "010-1234-5678"          
# [2] "anonymous 010-8888-8888"
# [3] "Phone: 010-1111-2222"   
# [4] "anonymous 018.1111.3333"
# [5] "Year(2007,2019,2020)"   
# [6] "anonymous 01077776666" 

基准测试(感谢 @jay.sf 提供 df2!)

df2 <- df[sample(nrow(df), 1e5, replace=T),,drop=F]
dim(df2)
# [1] 100000      1

bench::mark(
  stringr = str_replace_all(
    string = df2$phoneNumber,
    pattern = paste(delName, collapse = '|'),
    replacement = "anonymous"
  ),
  gsub = gsub(delNamec, 'anonymous', df2$phoneNumber)
)

# A tibble: 2 × 13
#  expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time  
#  <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>
# 1 stringr      45.4ms   46.7ms     20.9      781KB        0    11     0      525ms
# 2 gsub           97ms  111.8ms      9.18     781KB        0     5     0      544ms

关于r - 提高替换多个字符串的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70528299/

相关文章:

r - 如何使用时间序列数据在R中构建黄土模型

r - 如何反转R中数据帧的顺序

python - 如何有效地创建一个多维 numpy 数组,其条目仅取决于一维索引?

ruby-on-rails - 创建与 rails 请求分析器一起使用的脚本的最佳方法是什么?

javascript - 为数组中的对象分配优先级值

r - 是否可以通过 RPostgresql 运行 Postgres 反斜杠命令?

r - 如何按条件在r中其他列中对行进行排序?

javascript - Node.js - 检查字符串是否表示大量元素的有效日期时间的最快方法是什么?

javascript - 在 mongodb shell javascript forEach 函数中写入关注

javascript - underscore _.each 和 forEach 有什么区别?