你会如何在R中加速这样的for循环?

时间:2015-11-02 12:22:51

标签: r performance for-loop apply

我的代码有一个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]))

但它也需要很长时间。有关如何提高代码速度的任何建议?

1 个答案:

答案 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