替换R值

时间:2014-10-25 14:26:55

标签: r

是否有更快的方法来执行以下R替换

for(i in 1:545082) 
{
   index = i*33
   A[index,]$pred = B[index,]$pred
}

这个循环似乎永远在R.谢谢

3 个答案:

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