如何在 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
值。问题是 for
和 if
循环太慢了。 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)
在我当前的项目中,我有大约 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
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)