替换R值
有没有一种更快的方法来完成下面的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"]) 假
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