在我目前的项目中,我有大约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
。问题是for
和if
循环太慢了。 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
我想要上面的解决方案,其中我将遍历所有行。如果遇到任何非零收入值,那么它将添加所有先前的点击值。
我错过了什么吗?请纠正我。
答案 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)