我有一个"大";我需要做如下计算的数据帧:
data <- data.frame( "name"=c( "Tom", "Peter", "Peter", "Peter", "Tom", "Peter" ), "goal"=c(1,-2,2,3,-1,0), "total"=0 )
for( i in 1:nrow(data) ) {
count <- 0
for ( j in 1:i) {
if (data$name[j] == data$name[i]) {
count <- count + data$goal[j]
}
}
data$total[i] <- count
}
> data
name goal total
1 Tom 1 1
2 Peter -2 -2
3 John 2 2
4 Peter 3 1
5 Tom -1 0
6 Peter 0 1
我需要执行";合计";列中添加之前的进球数。
我的数据库目前有83000行,计算时间很长。我想在没有";对于";环你有主意吗?
我看到了下面的帖子,但我不知道如何调整它。
提前感谢
如果您想避免for
循环,请尝试找到可以执行所需操作的矢量化函数。(或处理数据帧或其他多维对象的函数(。对于您的示例,您可以使用group_by
和dplyr
根据name
分离数据帧,然后使用矢量化函数cumsum
(累积和(:
library(dplyr)
data <- data %>% group_by(name) %>% mutate(total = cumsum(goal))
输出
> data
# A tibble: 6 x 3
# Groups: name [2]
name goal total
<chr> <dbl> <dbl>
1 Tom 1 1
2 Peter -2 -2
3 Peter 2 0
4 Peter 3 3
5 Tom -1 0
6 Peter 0 3
我在你的文章中使用了你的数据帧初始化,这就是为什么我得到了与你不同的输出。
如果要在操作后删除分组,请使用ungroup
。