【问题标题】:Cumsum for different variables for unique game_id in RR中唯一game_id的不同变量的Cumsum
【发布时间】:2021-04-17 11:34:03
【问题描述】:

我有以下数据框,其中包含游戏 ID、玩家、动作类型(例如传球或运球)以及动作是成功还是失败。

df1 <- data.frame(
  game_id = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", 
              "2", "2", "2", "2", "2"),
  player  = c("X", "X", "X", "Y", "Y", "Z", "Z", "X", "Y", "Z", "Y", "Y", "Y", "X", "X", "Z",
              "Z", "X", "Z", "X"),
  type    = c("pass", "pass", "pass", "pass", "pass", "dribble", "dribble", 'tackle', "pass",
              "pass", "dribble", "pass", "dribble", "pass", "pass", "pass", "pass", "dribble", 
              "pass", "pass"),
  result  = c("success", "success", "fail", "success", "success", "success", "fail", "success",
              "fail", "success", "success", "fail", "fail", "success", "success", "fail", "fail",
              "success", "success", "success")
)

df1

#   game_id player    type  result
#1        1      X    pass success
#2        1      X    pass success
#3        1      X    pass    fail
#4        1      Y    pass success
#5        1      Y    pass success
#6        1      Z dribble success
#7        1      Z dribble    fail
#8        1      X  tackle success
#9        1      Y    pass    fail
#10       1      Z    pass success
#11       2      Y dribble success
#12       2      Y    pass    fail
#13       2      Y dribble    fail
#14       2      X    pass success
#15       2      X    pass success
#16       2      Z    pass    fail
#17       2      Z    pass    fail
#18       2      X dribble success
#19       2      Z    pass success
#20       2      X    pass success

我想做的是创建一些新列:

  • 第一列包含玩家在独特比赛中的每一次传球(无论传球失败还是成功)
  • 第二列包含玩家在一场独特的比赛中给出的每个 SUCCESS 通行证
  • 第三列显示每个球员在比赛中的成功率(因此球员的成功传球次数/球员传球总数)

最终的数据框应如下所示:

df2 <- data.frame(
  game_id = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
  player  = c("X", "X", "X", "Y", "Y", "Z", "Z", "X", "Y", "Z", "Y", "Y", "Y", "X", "X", "Z",
              "Z", "X", "Z", "X"),
  type    = c("pass", "pass", "pass", "pass", "pass", "dribble", "dribble", 'tackle', "pass",
              "pass","dribble", "pass", "dribble", "pass", "pass", "pass", "pass", "dribble", 
              "pass", "pass"),
  result  = c("success", "success", "fail", "success", "success", "success", "fail", "success",
              "fail", "success", "success", "fail", "fail", "success", "success", "fail", "fail",
              "success", "success", "success"),
  pass_per_player = c(1,2,3,1,2,0,0,3,3,1,0,1,1,1,2,1,2,2,3,3), 
  success_pass_player = c(1,2,2,1,2,0,0,2,2,1,0,0,0,1,2,0,0,2,1,3),
  #success_rate_player = c(1,1,0.66,1,1,0,0,0.66,0.66,1,0,0,0,1,1,0,0,1,0.33,1)
)

df2

#   game_id player    type  result pass_per_player success_pass_player success_rate_player
#1        1      X    pass success               1                   1                1.00
#2        1      X    pass success               2                   2                1.00
#3        1      X    pass    fail               3                   2                0.66
#4        1      Y    pass success               1                   1                1.00
#5        1      Y    pass success               2                   2                1.00
#6        1      Z dribble success               0                   0                0.00
#7        1      Z dribble    fail               0                   0                0.00
#8        1      X  tackle success               3                   2                0.66
#9        1      Y    pass    fail               3                   2                0.66
#10       1      Z    pass success               1                   1                1.00
#11       2      Y dribble success               0                   0                0.00
#12       2      Y    pass    fail               1                   0                0.00
#13       2      Y dribble    fail               1                   0                0.00
#14       2      X    pass success               1                   1                1.00
#15       2      X    pass success               2                   2                1.00
#16       2      Z    pass    fail               1                   0                0.00
#17       2      Z    pass    fail               2                   0                0.00
#18       2      X dribble success               2                   2                1.00
#19       2      Z    pass success               3                   1                0.33
#20       2      X    pass success               3                   3                1.00

【问题讨论】:

    标签: r


    【解决方案1】:

    第一个开始是这样的:

    df1 %>%
      group_by(game_id, player) %>%
      mutate(
        pass_per_player = cumsum(type=="pass"),
        success_pass_player = cumsum(result=="success" & type=="pass"),
        success_rate_player = success_pass_player / pass_per_player)
    # A tibble: 20 x 7
    # Groups:   game_id, player [6]
       game_id player type    result  pass_per_player success_pass_player success_rate_player
       <chr>   <chr>  <chr>   <chr>             <int>               <int>               <dbl>
     1 1       X      pass    success               1                   1               1    
     2 1       X      pass    success               2                   2               1    
     3 1       X      pass    fail                  3                   2               0.667
     4 1       Y      pass    success               1                   1               1    
     5 1       Y      pass    success               2                   2               1    
     6 1       Z      dribble success               0                   0             NaN    
     7 1       Z      dribble fail                  0                   0             NaN    
     8 1       X      tackle  success               3                   2               0.667
     9 1       Y      pass    fail                  3                   2               0.667
    10 1       Z      pass    success               1                   1               1    
    11 2       Y      dribble success               0                   0             NaN    
    12 2       Y      pass    fail                  1                   0               0    
    13 2       Y      dribble fail                  1                   0               0    
    14 2       X      pass    success               1                   1               1    
    15 2       X      pass    success               2                   2               1    
    16 2       Z      pass    fail                  1                   0               0    
    17 2       Z      pass    fail                  2                   0               0    
    18 2       X      dribble success               2                   2               1    
    19 2       Z      pass    success               3                   1               0.333
    20 2       X      pass    success               3                   3               1  
    

    如果要将NaNs 转换为0

    df1$success_rate_player[is.nan(df1$success_rate_player)] <- 0
    

    【讨论】:

    • 但是,我相信第一个 cumsum 并没有真正起作用,因为它会增加每次传球,而不是每个玩家的传球
    • 你想要的结果是一样的
    • 不幸的是,上面的代码给了我不同的输出。我现在尝试了以下方法:
    • df1 &lt;- ddply(df1, .(game_id, player), transform, pass_per_player = cumsum(type == "pass"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多