R 如何进行条件累积求和,这需要动态访问以前计算的元素?
我试图在基数R中有效地执行以下条件累积和,但我正在努力动态访问以前计算的元素。带有for循环的代码:R 如何进行条件累积求和,这需要动态访问以前计算的元素?,r,R,我试图在基数R中有效地执行以下条件累积和,但我正在努力动态访问以前计算的元素。带有for循环的代码: input <- c(6, 4, 8, 2, 2, 4, 2, 6) indx <- c(1, 1, 2, 2, 4, 3, 4, 5) desired_out <- rep(0, length(input)) for (i in seq_along(desired_out)) { print(desired_out[i] <- desired_out[i
input <- c(6, 4, 8, 2, 2, 4, 2, 6)
indx <- c(1, 1, 2, 2, 4, 3, 4, 5)
desired_out <- rep(0, length(input))
for (i in seq_along(desired_out)) {
print(desired_out[i] <- desired_out[indx[i]] + input[i])
}
# [1] 6
# [1] 10
# [1] 18
# [1] 12
# [1] 14
# [1] 22
# [1] 14
# [1] 20
<代码>输入< P>如果速度是最关心的,OP的代码可以容易地翻译成C++代码,使用<代码> Rcpp < /代码>如下: 样本数据:
library(data.table)
set.seed(0L)
M <- 1e6
ngrps <- 1e3
DT <- data.table(input=sample(10, M, replace=TRUE),
indx=sort(sample(ngrps, M, replace=TRUE)))
# DT <- data.table(input=c(6, 4, 8, 2, 2),
# indx=c(1, 1, 2, 2, 4))
使用数据计时和示例调用。表语法:
system.time(DT[, func(input, indx)])
# user system elapsed
# 0.00 0.01 0.02
与R循环的速度比较
M <- 1e6
ngrps <- 1e3
input <- sample(10, M, replace=TRUE),
indx <- sort(sample(ngrps, M, replace=TRUE)))
microbenchmark(
rcpp = func(input, indx),
Rloop = {
desired_out <- rep(0, length(input))
for (i in seq_along(desired_out)) {
desired_out[i] <- desired_out[indx[i]] + input[i]
}},
unit = 'relative',
times = 100)
# Unit: relative
# expr min lq mean median uq max neval
# rcpp 1.00000 1.00000 1.000000 1.00000 1.000000 1.0000000 100
# Rloop 14.80781 11.37963 6.712257 10.44288 6.244126 0.7554706 100
<代码> M> P>如果速度是最关心的,OP的代码可以很容易地转换成C++代码,使用<代码> Rcpp < /代码>如下:
样本数据:
library(data.table)
set.seed(0L)
M <- 1e6
ngrps <- 1e3
DT <- data.table(input=sample(10, M, replace=TRUE),
indx=sort(sample(ngrps, M, replace=TRUE)))
# DT <- data.table(input=c(6, 4, 8, 2, 2),
# indx=c(1, 1, 2, 2, 4))
使用数据计时和示例调用。表语法:
system.time(DT[, func(input, indx)])
# user system elapsed
# 0.00 0.01 0.02
与R循环的速度比较
M <- 1e6
ngrps <- 1e3
input <- sample(10, M, replace=TRUE),
indx <- sort(sample(ngrps, M, replace=TRUE)))
microbenchmark(
rcpp = func(input, indx),
Rloop = {
desired_out <- rep(0, length(input))
for (i in seq_along(desired_out)) {
desired_out[i] <- desired_out[indx[i]] + input[i]
}},
unit = 'relative',
times = 100)
# Unit: relative
# expr min lq mean median uq max neval
# rcpp 1.00000 1.00000 1.000000 1.00000 1.000000 1.0000000 100
# Rloop 14.80781 11.37963 6.712257 10.44288 6.244126 0.7554706 100
Msapply
应该更快
sapply(1:length(input), function(i){
desired_out[i]<<-desired_out[indx[i]] + input[i]
})
[1] 6 10 18 12 14 22 14 20
sapply(1:长度(输入)、函数(i){
所需的输出速度应该更快
sapply(1:length(input), function(i){
desired_out[i]<<-desired_out[indx[i]] + input[i]
})
[1] 6 10 18 12 14 22 14 20
sapply(1:长度(输入)、函数(i){
期望输出[i]我可以问一下为什么这个for循环对u不起作用吗?你在处理什么类型的维度?数百万行,但重要的是,这些行是分组的,所以我想使用split-apply-combine工作流,使用data.table
。我不清楚逻辑。基于indx
,你想回顾多少元素?你能解释一个例子吗对于indx
=4可能足够了吗?indx
向量只是给出了要查找的结果向量的索引。条件indx我可以问一下为什么这个for循环对u不起作用吗?你在处理什么样的维度?数百万行,但重要的是,行是分组的,所以我想使用split-apply-combine工作流data.table
。我不清楚逻辑。基于indx
,你想回顾多少元素?你能解释一下indx
=4的一个例子吗?indx
向量只是给出了要查找的结果向量的索引。条件indx谢谢你。不幸的是,我目前无法找到o不使用Rcpp,但将来可能会改变。:(我接受这个答案,尽管它不能完全满足我的要求。但是,显示R循环(使用预分配内存)的基准测试只比Rcpp解决方案慢一个数量级是非常有用的。你想要什么?我希望我在我的帖子的第一句话中概括了我想要的:“我正在尝试以R为基数高效地进行以下条件累积和”我不认为<代码> Rcpp < /C>解决方案满足这个要求,即使它是有用的。谢谢。不幸的是,我现在被限制不使用RCPP,但是将来可能会改变。(我接受这个答案,即使它没有做我想要的。但是,显示R循环的基准。(使用预分配内存)只比Rcpp解决方案慢一个数量级非常有用。您想要什么?我希望我在帖子的第一句话中概括了我想要的内容:“我正在尝试以R为基数高效地执行以下条件累积和”我不认为<代码> Rcpp < /代码>解决方案满足这个要求,即使它是有用的。谢谢你的回答,但是我不认为这比你提供的for循环更快,也没有什么明显的不同。ACK,你是对的。当我对它进行基准测试时,我已经把你的名字留给了<代码>打印< /代码>,但是显然你不需要它。最终解决方案。感谢您的回答,但我认为这不会更快,也不会与我提供的for循环有明显区别。确认,您是对的。我在您的电话中留下了print
,当时我对它进行了基准测试,但显然您在最终解决方案中不需要它。