如何在 R 中加速 for 和 if 循环

How to speedup for and if loop in R

在我当前的项目中,我有大约 820 万行。如果特定列的值不为零,我想扫描所有行并应用特定函数。

counter=1
for(i in 1:nrow(data)){
if(data[i,8]!=0){
totalclicks=sum(data$Clicks[counter:(i-1)])
test$Clicks[i]=totalclicks
counter=i
  }
}

在上面的代码中,我正在搜索超过 820 万行的特定列,如果值不为零,那么我将计算 sum 值。问题是 forif 循环太慢了。 50K 行需要 1 小时。我听说 apply family 是替代方案。以下代码也耗时过长:

sapply(1:nrow(data), function(x) 
if(data[x,8]!=0){
totalclicks=sum(data$Clicks[counter:(x-1)])
test$Clicks[x]=totalclicks
counter=x
})

[更新] 请将以下内容视为示例数据集:

clicks revenue new_column (sum of previous clicks)
  1      0       
  2      0
  3      5        3
  1      0
  4      0
  2      7        8

我想要上述解决方案,我将在其中遍历所有行。如果遇到任何非零收入值,那么它将添加所有以前的点击值。

我错过了什么吗?请指正。

aggregate() 函数可用于将长数据帧拆分为块并对每个块执行操作,因此您可以在示例中应用它:

data <- data.frame(Clicks=c(1,2,3,1,4,2),
                   Revenue=c(0,0,5,0,0,7),
                   new_column=NA)

sub_totals <- aggregate(data$Clicks, list(cumsum(data$Revenue)), sum)
data$new_column[data$Revenue != 0] <- head(sub_totals$x, -1)