如何根据因子在R中创建一个运行总计?

时间:2017-06-16 04:33:48

标签: r

我希望为运动数据创建一个跑分线。例如,请考虑我的数据如下:

df <- data.frame(Club = c("O", "H", "H", "O", "H", "O", "O"),
                 TimeOfScore = c("1:30", "2:06", "7:09", "9:09", "11:08", "14:32", "19:11"),
                 Points = c(1, 3, 1, 2, 2, 3, 3))

在上文中,"df$Club==O"表示反对派的得分,而df$Club=="H"。列df$TimeOfScore表示分数发生的时间。我希望知道对手在主队前方或下方有多少得分。

我的预期输出是:

df$Margin <- c(-1, 2, 3, 1, 3, 0, -3)

此输出基于反对队前方或下方与主队相比多少分。例如,对手队在1:30(1分30秒)得分1分,进入比赛。该时间点的相应保证金为-1或主队减少一个点。在下一次比赛中,主队得分为3分,然后领先2分。

我怎么能这样做呢?

2 个答案:

答案 0 :(得分:5)

df$Margin = with(df, cumsum(ifelse(Club == "H", Points, -Points)))
# df
# Club Points Margin
# 1    O      1     -1
# 2    H      3      2
# 3    H      1      3
# 4    O      2      1
# 5    H      2      3
# 6    O      3      0
# 7    O      3     -3

答案 1 :(得分:3)

用文字

您可以测试Club是否为&#34; H&#34;或者&#34; O&#34;,这将给出一个真或假。

然后,您可以使用T == 1F == 0添加1的事实。

然后使用此结果对向量c(-1, 1)进行子集化,然后将此值乘以points

然后找到累计金额,然后找到你的答案。

代码

df$Margin <- cumsum(c(-1, 1)[(df$Club == "H")+1] * df$Points)

df
#   Club Points Margin
# 1    O      1     -1
# 2    H      3      2
# 3    H      1      3
# 4    O      2      1
# 5    H      2      3
# 6    O      3      0
# 7    O      3     -3