我的代码有一个for循环,需要花费很长时间才能运行。我想知道如何通过使用R中可用的一个应用系列函数来加速它。
我想要改变的for循环看起来像这样:
for (i in range(1:200000)){
a[i] = gsub(pattern[i],new_pattern[i])
}
其中pattern和new_pattern都是列表。我想要实现的是改变每一行中的字符模式。我尝试过以下方法:
sapply(c(1:200000),function(x) gsub(pattern[x],new_pattern[x], a[x]))
但它也需要很长时间。有关如何提高代码速度的任何建议?
答案 0 :(得分:2)
您可以使用命名向量从str_replace_all
包继续stringr
:
library(stringr)
x = 'dog likes cat very much'
str_replace_all(x, setNames(c('babyboy','babygirl'), c('dog','cat')))
#[1] "babyboy likes babygirl very much"
效果快7-8倍
set.seed(1)
x = paste0(sample(c(letters,' '), 100000, replace=T, prob=c(rep(1/39, 26), 1/3)), collapse='')
patt = apply(df, 1, paste0, collapse='')
repl = as.character(1:456976)
system.time({
for (i in 1:456976){
x = gsub(patt[i],repl[i], x)
}
})
# user system elapsed
#1574.41 2.41 1582.71
system.time(str_replace_all(x, setNames(repl, patt)))
# user system elapsed
# 194.04 0.14 194.36