在我目前的项目中,我有大约820万行。如果特定列的值不为零,我想扫描所有行并应用某个函数。如何加速和如果循环R
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
我想上面的一种解决方案,其中我将通过所有行。如果遇到任何非零收入值,则会添加以前的所有点击次数值。
我错过了什么吗?请纠正我。
这很可能在几秒钟之内,如果你使用完成适当的矢量化,而不是循环遍历每一行。如果您提供可重复的示例和预期输出,您将获得更好的帮助。 –
@docendodiscimus:我已通过添加示例数据集更新了问题。 –
10是如何计算的? –