我希望为运动数据创建一个跑分线。例如,请考虑我的数据如下:
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分。
我怎么能这样做呢?
答案 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 == 1
和F == 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