是否有更快的方法来执行以下R替换
for(i in 1:545082)
{
index = i*33
A[index,]$pred = B[index,]$pred
}
这个循环似乎永远在R.谢谢
答案 0 :(得分:3)
假设您有一个data.frame
,您可以使用data.table的set
函数来替换引用值。这应该非常快,因为没有副本。
library(data.table)
set(A, i=1:545082*33, j="pred", B[i:545082*33, "pred"])
答案 1 :(得分:3)
一些基准。 data.table::set()
确实比常规数据帧分配快得多,但巨大的差异来自矢量化赋值(避免for
循环)。使用矢量化赋值可以提高15000倍的速度,或者使用data.table::set()
增加200,000倍(再次以矢量化方式)。
已更新:在set
循环中添加了for
,这是速度的中间(比在循环中进行分配要快得多,并且只比执行一个循环慢50倍)矢量化分配)。
n <- 1e5
m <- 30
s <- as.integer(seq(1,n,by=m))
set.seed(101)
A <- B <- data.frame(x=runif(n),y=runif(n))
library("data.table")
library("rbenchmark")
benchmark(for(i in s) { A[i,]$y <- B[i,]$y },
for(i in s) { A[i,"y"] <- B[i,"y"] },
for(i in s) { set (A,i=i,j="y",B[i,"y"]) },
A[s,"y"] <- B[s,"y"],
set(A, i=s, j="y", B[s,"y"]),
replications=20,
columns = c("test", "elapsed", "relative"))
## test elapsed relative
## A[s, "y"] <- B[s, "y"] 0.027 13.5
## for (...) { A[i, "y"] <- B[i, "y"]} 94.797 47398.5
## for (...) { A[i, ]$y <- B[i, ]$y} 409.383 204691.5
## for (...) { set(A,i=i,j="y",B[i,"y"])} 1.283 641.5
## set(A, i = s, j = "y", B[s, "y"]) 0.002 1.0
答案 2 :(得分:0)
尝试:
n = 545083*33
A$pred[1:n] = B$pred[1:n]