我有一个data.table DF如下。第三个库是当时拥有球的球队(以分钟和秒为单位)。
y
我想创建两个新列。每一个总计每个团队的目标数量。例如,输出应为:
minute second teamId isGoal
1: 10 22 Atletico MG 0
2: 10 26 Atletico MG 0
3: 10 30 Atletico MG 0
4: 10 33 Atletico MG 0
5: 10 35 Atletico MG 0
6: 10 37 Atletico MG 0
7: 10 38 Atletico MG 1
8: 10 40 Atletico GO 0
9: 10 42 Atletico GO 0
10: 10 48 Atletico GO 1
11: 10 51 Atletico MG 0
12: 10 54 Atletico MG 1
13: 10 60 Atletico MG 0
想要避免for循环。我确定在data.table中必须很容易,但是怎么做?
答案 0 :(得分:1)
以下是使用dplyr
和“玩具”示例的解决方案,该示例与您在开场白中提供的数据框架类似。
基本上,如果该团队在数据帧的特定行中对目标进行了评分,基本上您希望每个团队的列都有一个指标。然后使用cumsum()
函数在这些新生成的列中累积。
library(dplyr)
x <- data.frame( teamID=c('A', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'A'),
isGoal=c(0,0,1,0,1,0,0,1, 0) ) %>%
mutate( AGoal = cumsum( isGoal*(teamID=='A') ),
BGoal = cumsum( isGoal*(teamID=='B') ) )
输出:
teamID isGoal AGoal BGoal
A 0 0 0
A 0 0 0
B 1 0 1
A 0 0 1
A 1 1 1
B 0 1 1
B 0 1 1
B 1 1 2
A 0 1 2