我有一个足球比赛得分的大型数据集,按比赛排序和进球得分的顺序。它采用以下格式。目前我只有前两列,第三列是我正在努力制作的:
Goal.Sequence Goal.Difference Running.Difference
0 0 0
1 1 1
2 -1 0
25 0 0
0 0 0
1 1 1
2 1 2
3 -1 1
4 1 2
25 0 2
0 0 0
1 -1 -1
2 -1 -2
25 0 -2
除了序列号为0或25的任何行(这些是匹配起点和匹配结束点的虚拟行)之外,每行代表一个得分的目标。 Goal.Difference列从主队的角度表示目标(如果他们得分则为+1,如果他们承认则为-1)。因此,上述数据样本代表3种不同的匹配,其结果为1-1,3-1和0-2。
我想为匹配中的运行得分差异创建第三列,但在每次新匹配时重新启动。我正在努力做到这一点,任何帮助将不胜感激。
遵循一些示例数据:
# Provide data in a usable format (e.g. using dput on your data object)
scores <- structure(list(Goal.Sequence = c(0L, 1L, 2L, 25L, 0L, 1L, 2L,
3L, 4L, 25L, 0L, 1L, 2L, 25L),
Goal.Difference = c(0L, 1L, -1L, 0L, 0L, 1L, 1L,
-1L, 1L, 0L, 0L, -1L, -1L, 0L)),
.Names = c("Goal.Sequence", "Goal.Difference", "match"),
row.names = c(NA, -14L), class = "data.frame")
答案 0 :(得分:0)
如果您创建一个标签,指示行所属的匹配项:
labl <- cumsum(df$Goal.Sequence==25)
然后你可以通过
做一个基于匹配的cumsumave(df$Goal.Difference, labl, FUN=cumsum)
答案 1 :(得分:0)
最好将每个变量保留在自己的列中。鉴于此,有许多方法可以满足您的需求。例如:
# Keep track of each match in its own variable. Use filter from package stats
scores$match <- as.integer(stats::filter(x=scores$Goal.Sequence==0,
filter=1, method='recursive'))
# Drop the dummy rows
scores <- scores[!scores$Goal.Sequence %in% c(0,25),]
# Run a cumsum on the Goal.Difference by match
library(package=dplyr) # Very useful for data manipulation
scores <- scores %.%
group_by(match) %.%
mutate(Running.Difference=cumsum(Goal.Difference)) %.%
select(match, Goal.Sequence, Goal.Difference, Running.Difference)