如何在R中加速和if循环

时间:2017-08-31 08:58:59

标签: r for-loop lapply sapply

在我目前的项目中,我有大约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家庭可以替代这个。以下代码也需要很长时间:

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

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

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

1 个答案:

答案 0 :(得分:1)

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)