替换R值

替换R值,r,R,有没有一种更快的方法来完成下面的R替换 for(i in 1:545082) { index = i*33 A[index,]$pred = B[index,]$pred } 这个循环似乎在R中持续了很久。感谢假设您有一个data.frame您可以使用data.table的set函数通过引用替换值。这应该很快,因为没有复制品 library(data.table) set(A, i=1:545082*33, j="pred", B[i:545082*33, "pred"]) 假

有没有一种更快的方法来完成下面的R替换

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

这个循环似乎在R中持续了很久。感谢假设您有一个
data.frame
您可以使用data.table的
set
函数通过引用替换值。这应该很快,因为没有复制品

library(data.table)
set(A, i=1:545082*33, j="pred", B[i:545082*33, "pred"])

假设您有一个
data.frame
,您可以使用data.table的
set
函数通过引用替换值。这应该很快,因为没有复制品

library(data.table)
set(A, i=1:545082*33, j="pred", B[i:545082*33, "pred"])
尝试:

尝试:


一些基准
data.table::set()
确实比常规数据帧分配快得多,但巨大的差异来自矢量化分配(避免了
for
循环)。使用矢量化分配可以使速度提高约15000倍,使用
data.table::set()
(同样以矢量化方式)可以使速度提高200000倍

更新:在
for
循环中添加了
设置
,速度适中(比在循环中执行赋值快得多,比执行向量化赋值慢50倍)


n一些基准测试
data.table::set()
确实比常规数据帧分配快得多,但巨大的差异来自矢量化分配(避免了
for
循环)。使用矢量化分配可以使速度提高约15000倍,使用
data.table::set()
(同样以矢量化方式)可以使速度提高200000倍

更新:在
for
循环中添加了
设置
,速度适中(比在循环中执行赋值快得多,比执行向量化赋值慢50倍)


n什么是
A
?什么是
B
<代码>A[1:545083*33,]$pred谢谢GSee,但我喜欢每隔33个项目分配一次。使用data.table library设置选项会更快。然后您可以使用
seq(1545082,by=33)
。这是一个不同于如何加速代码的问题。什么是
a
?什么是
B
<代码>A[1:545083*33,]$pred谢谢GSee,但我喜欢每隔33个项目分配一次。使用data.table library设置选项会更快。然后您可以使用
seq(1545082,by=33)
。这是一个不同于如何加速代码的问题。
1:(545082*33)
1:545083*33
不同。此答案将给出一个错误,即替换的行数与数据的行数不同。试试看:
BOD$demand[1:10]事实上,我想它不会给出那个错误,因为OP意味着
A
B
中至少有
154083*33
行。尽管如此,您的代码与OP(或我在问题下的评论中的代码)所做的事情并不相同。
1:(545082*33)
1:545083*33
不同。此答案将给出一个错误,即替换的行数与数据的行数不同。试试看:
BOD$demand[1:10]事实上,我想它不会给出那个错误,因为OP意味着
A
B
中至少有
154083*33
行。尽管如此,您的代码与OP(或我在问题下的评论中的代码)所做的事情并不相同,“但有着巨大的差异……”——这也是因为
set
通过引用进行更新。做
A[i,j]所以我想我真的应该把
for(i in s){set(A,i=i,j=“y”,B[i,y”])}
添加到基准测试中……是的,这会更清楚地描述仅仅因为复制列而花费的时间,以及由于矢量化而获得的速度。“但是巨大的差异……”-另一个原因是
set
通过引用进行更新。做
A[i,j]所以我想我真的应该把
for(i in s){set(A,i=i,j=“y”,B[i,y”])}
添加到基准测试中……是的,这会更清楚地描述仅仅因为复制列而花费的时间,以及由于矢量化而获得的速度。
 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