R 如何进行条件累积求和,这需要动态访问以前计算的元素?

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

我试图在基数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[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

M
sapply
应该更快

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
,当时我对它进行了基准测试,但显然您在最终解决方案中不需要它。