首页 > 解决方案 > 如何用R中的空格替换多个单词?

问题描述

这是一个例子:

drugs<-c("Lapatinib-Ditosylate", "Caffeic-Acid-Phenethyl-Ester", "Pazopanib-HCl", "D-Pantethine")

ads<-"These are recently new released drugs Lapatinib Ditosylate, Pazopanib HCl, and Caffeic Acid Phenethyl Ester"

我想要的是用名称更正药物名称,ads以便drugs所需的输出为:

"These are recently new released drugs Lapatinib-Ditosylate, Pazopanib-HCl, and Caffeic-Acid-Phenethyl-Ester"

标签: r

解决方案


如果创建要替换的单词向量,则可以循环遍历该向量和替换它们的单词向量 ( drugs),在循环的每次交互中替换一个元素的所有实例。

to_repl <- gsub('-', ' ', drugs)

for(i in seq_along(drugs))
  ads <- gsub(to_repl[i], drugs[i], ads)

ads
# "These are recently new released drugs Lapatinib-Ditosylate, Pazopanib-HCl, and Caffeic-Acid-Phenethyl-Ester"

与流行的看法相反,forR 中的 -loops 并不慢于lapply

f_lapply <- function(ads){
  to_repl <- gsub('-', ' ', drugs)
  invisible(lapply(seq_along(to_repl), function(i) {
    ads <<- gsub(to_repl[i], drugs[i], ads)
  }))
  ads
}
f_loop <- function(ads){
  to_repl <- gsub('-', ' ', drugs)
  for(i in seq_along(to_repl))
    ads <- gsub(to_repl[i], drugs[i], ads)
  ads
}

f_loop(ads) == f_lapply(ads)
# [1] TRUE

microbenchmark::microbenchmark(f_loop(ads), f_lapply(ads), times = 1e4)
# Unit: microseconds
#           expr    min      lq     mean  median      uq       max neval
#    f_loop(ads) 59.488  95.180 118.0793 107.487 120.205  7426.866 10000
#  f_lapply(ads) 69.333 114.462 147.9732 130.872 152.205 27283.670 10000

或者,使用更一般的示例:

loop_over <- 1:1e5
microbenchmark::microbenchmark(
  for_loop = {for(i in loop_over) 1},
  lapply   = {lapply(loop_over, function(x) 1)}
  )
# Unit: milliseconds
#      expr      min         lq       mean     median         uq       max neval
#  for_loop  4.66174   5.865842   7.725975   6.354867   7.449429  35.26807   100
#    lapply 94.09223 114.378778 125.149863 124.665128 134.217326 170.16889   100

loop_over <- 1:1e5
microbenchmark::microbenchmark(
  for_loop = {y <- numeric(1e5); for(i in seq_along(loop_over)) y[i] <- loop_over[i]},
  lapply   = {lapply(loop_over, function(x) x)}
  )
# Unit: milliseconds
#      expr      min       lq     mean   median       uq     max neval
#  for_loop 11.00184 11.49455 15.24015 12.10461 15.26050 134.139   100
#    lapply 71.41820 81.14660 93.64569 87.05162 98.59295 357.219   100

推荐阅读