在R中如何加速这样的for循环?
我的代码有一个for循环,它需要运行很长时间。我想知道如何使用R中可用的一个apply系列函数来加速它 我要更改的for循环如下所示:在R中如何加速这样的for循环?,r,performance,for-loop,apply,R,Performance,For Loop,Apply,我的代码有一个for循环,它需要运行很长时间。我想知道如何使用R中可用的一个apply系列函数来加速它 我要更改的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]
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]))
但这也需要很长时间。有没有关于如何改进代码以提高速度的建议 您可以使用命名向量从stringr包继续str_replace_all:
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
欢迎来到StackOverflow!请阅读相关信息以及如何给出建议。这将使其他人更容易帮助您。循环是完全不必要的,gsub和基本包中的几乎所有函数一样,都已经矢量化了。只需执行gsubpatter,即新的_模式,a即可。正如@kliron所说,R中的许多函数都是矢量化的。For循环有其用途,但很少需要。@kliron不太需要,gsub不能接受模式和替换的向量。它只在x上矢量化。这就是OP需要提供一个可复制的例子的原因。如果你所关心的只是加速一个循环,尝试与“foreach”并行,你知道str_replace_all的性能与gsub上的循环相比如何吗?我认为str_替换_都应该更快。。。