R - 体育成绩的跑分数栏

时间:2014-04-28 15:30:36

标签: r dataframe

我有一个足球比赛得分的大型数据集,按比赛排序和进球得分的顺序。它采用以下格式。目前我只有前两列,第三列是我正在努力制作的:

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")

2 个答案:

答案 0 :(得分:0)

如果您创建一个标签,指示行所属的匹配项:

labl <- cumsum(df$Goal.Sequence==25)

然后你可以通过

做一个基于匹配的cumsum
ave(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)