在R中找到导致失误(被对手拦截)的不成功传球

Finding unsuccessful pass leading to turnover (interception by opponent) in R

我试图找出每位球员导致对手失误(因此被拦截)的传球失败次数。参见type_nameresult_name列,发生这种情况的情况在第43和46行(因此第42和45行是不成功的传球,应该计算在内)。

df1 <- structure(list(game_id = c(303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 303377L, 
303377L, 303377L, 303377L, 303377L), period_id = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    time_seconds = c(0.229, 3.162, 5.996, 8.285, 12.325, 20.577, 
    22.06, 30.931, 32.254, 35.179, 66.245, 81.801, 96.335, 97.383, 
    98.807, 99.139, 101.542, 147.939, 153.847, 155.684, 161.605, 
    165.777, 171.044, 173.955, 204.484, 206.445, 208.583, 232.458, 
    233.734, 234.682, 236.246, 240.425, 241.458, 256.3, 259.524, 
    260.83, 264.041, 284.931, 289.491, 291.895, 293.879, 294.599, 
    294.993, 295.747, 298.98, 299.941, 301.387, 303.017, 304.006, 
    308.563), home_team = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, 
    FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, 
    TRUE, TRUE, TRUE, TRUE, TRUE), team_name = c("Barcelona", 
    "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", 
    "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", 
    "Barcelona", "Barcelona", "Getafe", "Getafe", "Barcelona", 
    "Getafe", "Barcelona", "Barcelona", "Barcelona", "Getafe", 
    "Getafe", "Barcelona", "Getafe", "Barcelona", "Barcelona", 
    "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", 
    "Getafe", "Getafe", "Barcelona", "Barcelona", "Barcelona", 
    "Barcelona", "Barcelona", "Barcelona", "Barcelona", "Barcelona", 
    "Barcelona", "Getafe", "Getafe", "Getafe", "Barcelona", "Barcelona", 
    "Barcelona", "Barcelona", "Barcelona"), player_name = c("Antoine Griezmann", 
    "Sergio Busquets i Burgos", "Sergi Roberto Carnicer", "Gerard Piqué Bernabéu", 
    "Samuel Yves Umtiti", "Arthur Henrique Ramos de Oliveira Melo", 
    "Sergio Busquets i Burgos", "Antoine Griezmann", "Arthur Henrique Ramos de Oliveira Melo", 
    "Sergi Roberto Carnicer", "Anssumane Fati", "Jordi Alba Ramos", 
    "Sergio Busquets i Burgos", "Nemanja Maksimovic", "Jaime Mata Arnaiz", 
    "Sergio Busquets i Burgos", "Marc Cucurella Saseta", "Antoine Griezmann", 
    "Anssumane Fati", "Jordi Alba Ramos", "Jorge Molina Vidal", 
    "Djené Dakonam Ortega", "Gerard Piqué Bernabéu", "Xabier Etxeita Gorritxategi", 
    "Arthur Henrique Ramos de Oliveira Melo", "Frenkie de Jong", 
    "Gerard Piqué Bernabéu", "Sergio Busquets i Burgos", "Samuel Yves Umtiti", 
    "Jordi Alba Ramos", "Samuel Yves Umtiti", "Mauro Wilney Arambarri Rosa", 
    "Nemanja Maksimovic", "Sergio Busquets i Burgos", "Frenkie de Jong", 
    "Arthur Henrique Ramos de Oliveira Melo", "Sergi Roberto Carnicer", 
    "Gerard Piqué Bernabéu", "Samuel Yves Umtiti", "Sergio Busquets i Burgos", 
    "Frenkie de Jong", "Lionel Andrés Messi Cuccittini", "Xabier Etxeita Gorritxategi", 
    "Jorge Molina Vidal", "Marc Cucurella Saseta", "Samuel Yves Umtiti", 
    "Sergio Busquets i Burgos", "Frenkie de Jong", "Antoine Griezmann", 
    "Frenkie de Jong"), type_name = c("pass", "pass", "pass", 
    "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", 
    "pass", "pass", "pass", "pass", "interception", "pass", "pass", 
    "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", 
    "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", 
    "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", 
    "interception", "pass", "pass", "interception", "pass", "pass", 
    "pass", "pass"), result_name = c("success", "success", "success", 
    "success", "success", "success", "success", "success", "success", 
    "success", "fail", "success", "fail", "success", "fail", 
    "fail", "success", "success", "success", "success", "success", 
    "success", "fail", "success", "success", "success", "success", 
    "success", "success", "success", "success", "success", "offside", 
    "success", "success", "success", "fail", "success", "success", 
    "success", "success", "fail", "success", "success", "fail", 
    "success", "success", "success", "success", "success")), row.names = c(NA, 
50L), class = "data.frame")

# Output
df1

   game_id period_id time_seconds home_team team_name                            player_name    type_name result_name
1   303377         1        0.229      TRUE Barcelona                      Antoine Griezmann         pass     success
2   303377         1        3.162      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
3   303377         1        5.996      TRUE Barcelona                 Sergi Roberto Carnicer         pass     success
4   303377         1        8.285      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
5   303377         1       12.325      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
6   303377         1       20.577      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
7   303377         1       22.060      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
8   303377         1       30.931      TRUE Barcelona                      Antoine Griezmann         pass     success
9   303377         1       32.254      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
10  303377         1       35.179      TRUE Barcelona                 Sergi Roberto Carnicer         pass     success
11  303377         1       66.245      TRUE Barcelona                         Anssumane Fati         pass        fail
12  303377         1       81.801      TRUE Barcelona                       Jordi Alba Ramos         pass     success
13  303377         1       96.335      TRUE Barcelona               Sergio Busquets i Burgos         pass        fail
14  303377         1       97.383     FALSE    Getafe                     Nemanja Maksimovic         pass     success
15  303377         1       98.807     FALSE    Getafe                      Jaime Mata Arnaiz         pass        fail
16  303377         1       99.139      TRUE Barcelona               Sergio Busquets i Burgos interception        fail
17  303377         1      101.542     FALSE    Getafe                  Marc Cucurella Saseta         pass     success
18  303377         1      147.939      TRUE Barcelona                      Antoine Griezmann         pass     success
19  303377         1      153.847      TRUE Barcelona                         Anssumane Fati         pass     success
20  303377         1      155.684      TRUE Barcelona                       Jordi Alba Ramos         pass     success
21  303377         1      161.605     FALSE    Getafe                     Jorge Molina Vidal         pass     success
22  303377         1      165.777     FALSE    Getafe                   Djené Dakonam Ortega         pass     success
23  303377         1      171.044      TRUE Barcelona                  Gerard Piqué Bernabéu         pass        fail
24  303377         1      173.955     FALSE    Getafe            Xabier Etxeita Gorritxategi         pass     success
25  303377         1      204.484      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
26  303377         1      206.445      TRUE Barcelona                        Frenkie de Jong         pass     success
27  303377         1      208.583      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
28  303377         1      232.458      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
29  303377         1      233.734      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
30  303377         1      234.682      TRUE Barcelona                       Jordi Alba Ramos         pass     success
31  303377         1      236.246      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
32  303377         1      240.425     FALSE    Getafe            Mauro Wilney Arambarri Rosa         pass     success
33  303377         1      241.458     FALSE    Getafe                     Nemanja Maksimovic         pass     offside
34  303377         1      256.300      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
35  303377         1      259.524      TRUE Barcelona                        Frenkie de Jong         pass     success
36  303377         1      260.830      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
37  303377         1      264.041      TRUE Barcelona                 Sergi Roberto Carnicer         pass        fail
38  303377         1      284.931      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
39  303377         1      289.491      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
40  303377         1      291.895      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
41  303377         1      293.879      TRUE Barcelona                        Frenkie de Jong         pass     success
42  303377         1      294.599      TRUE Barcelona         Lionel Andrés Messi Cuccittini         pass        fail
43  303377         1      294.993     FALSE    Getafe            Xabier Etxeita Gorritxategi interception     success
44  303377         1      295.747     FALSE    Getafe                     Jorge Molina Vidal         pass     success
45  303377         1      298.980     FALSE    Getafe                  Marc Cucurella Saseta         pass        fail
46  303377         1      299.941      TRUE Barcelona                     Samuel Yves Umtiti interception     success
47  303377         1      301.387      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
48  303377         1      303.017      TRUE Barcelona                        Frenkie de Jong         pass     success
49  303377         1      304.006      TRUE Barcelona                      Antoine Griezmann         pass     success
50  303377         1      308.563      TRUE Barcelona                        Frenkie de Jong         pass     success

我目前正在尝试通过 data table 方法解决此问题,但我检索到太多 TRUE 值(每次通过失败都会导致拦截,但如果这些拦截具有 result_name == fail,那么他们不应该算):

# Make it a data.table
setDT(df1)
# Create an id-column
df1[, rowid := .I]
# Set id column as key
setkey(df1, rowid)
# Create temp data.table with all succesfull interceptions
dt.intercept.success <- df1[type_name == "interception" & result_name == "success", ]
# perform join on all failed passes
df2 <- df1[df1[type_name == "pass" & result_name == "fail", ], fail_pass_turnover := {
  temp <- dt.intercept.success[!home_team == i.home_team & 
                            game_id == i.game_id &
                            period_id == i.period_id, ]
  list(nrow(temp) > 0)
}, by = .EACHI][]

# output
    game_id period_id time_seconds home_team team_name                            player_name    type_name result_name
 1:  303377         1        0.229      TRUE Barcelona                      Antoine Griezmann         pass     success
 2:  303377         1        3.162      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
 3:  303377         1        5.996      TRUE Barcelona                 Sergi Roberto Carnicer         pass     success
 4:  303377         1        8.285      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
 5:  303377         1       12.325      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
 6:  303377         1       20.577      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
 7:  303377         1       22.060      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
 8:  303377         1       30.931      TRUE Barcelona                      Antoine Griezmann         pass     success
 9:  303377         1       32.254      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
10:  303377         1       35.179      TRUE Barcelona                 Sergi Roberto Carnicer         pass     success
11:  303377         1       66.245      TRUE Barcelona                         Anssumane Fati         pass        fail
12:  303377         1       81.801      TRUE Barcelona                       Jordi Alba Ramos         pass     success
13:  303377         1       96.335      TRUE Barcelona               Sergio Busquets i Burgos         pass        fail
14:  303377         1       97.383     FALSE    Getafe                     Nemanja Maksimovic         pass     success
15:  303377         1       98.807     FALSE    Getafe                      Jaime Mata Arnaiz         pass        fail
16:  303377         1       99.139      TRUE Barcelona               Sergio Busquets i Burgos interception        fail
17:  303377         1      101.542     FALSE    Getafe                  Marc Cucurella Saseta         pass     success
18:  303377         1      147.939      TRUE Barcelona                      Antoine Griezmann         pass     success
19:  303377         1      153.847      TRUE Barcelona                         Anssumane Fati         pass     success
20:  303377         1      155.684      TRUE Barcelona                       Jordi Alba Ramos         pass     success
21:  303377         1      161.605     FALSE    Getafe                     Jorge Molina Vidal         pass     success
22:  303377         1      165.777     FALSE    Getafe                   Djené Dakonam Ortega         pass     success
23:  303377         1      171.044      TRUE Barcelona                  Gerard Piqué Bernabéu         pass        fail
24:  303377         1      173.955     FALSE    Getafe            Xabier Etxeita Gorritxategi         pass     success
25:  303377         1      204.484      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
26:  303377         1      206.445      TRUE Barcelona                        Frenkie de Jong         pass     success
27:  303377         1      208.583      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
28:  303377         1      232.458      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
29:  303377         1      233.734      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
30:  303377         1      234.682      TRUE Barcelona                       Jordi Alba Ramos         pass     success
31:  303377         1      236.246      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
32:  303377         1      240.425     FALSE    Getafe            Mauro Wilney Arambarri Rosa         pass     success
33:  303377         1      241.458     FALSE    Getafe                     Nemanja Maksimovic         pass     offside
34:  303377         1      256.300      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
35:  303377         1      259.524      TRUE Barcelona                        Frenkie de Jong         pass     success
36:  303377         1      260.830      TRUE Barcelona Arthur Henrique Ramos de Oliveira Melo         pass     success
37:  303377         1      264.041      TRUE Barcelona                 Sergi Roberto Carnicer         pass        fail
38:  303377         1      284.931      TRUE Barcelona                  Gerard Piqué Bernabéu         pass     success
39:  303377         1      289.491      TRUE Barcelona                     Samuel Yves Umtiti         pass     success
40:  303377         1      291.895      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
41:  303377         1      293.879      TRUE Barcelona                        Frenkie de Jong         pass     success
42:  303377         1      294.599      TRUE Barcelona         Lionel Andrés Messi Cuccittini         pass        fail
43:  303377         1      294.993     FALSE    Getafe            Xabier Etxeita Gorritxategi interception     success
44:  303377         1      295.747     FALSE    Getafe                     Jorge Molina Vidal         pass     success
45:  303377         1      298.980     FALSE    Getafe                  Marc Cucurella Saseta         pass        fail
46:  303377         1      299.941      TRUE Barcelona                     Samuel Yves Umtiti interception     success
47:  303377         1      301.387      TRUE Barcelona               Sergio Busquets i Burgos         pass     success
48:  303377         1      303.017      TRUE Barcelona                        Frenkie de Jong         pass     success
49:  303377         1      304.006      TRUE Barcelona                      Antoine Griezmann         pass     success
50:  303377         1      308.563      TRUE Barcelona                        Frenkie de Jong         pass     success
   
 1:     1                 NA
 2:     2                 NA
 3:     3                 NA
 4:     4                 NA
 5:     5                 NA
 6:     6                 NA
 7:     7                 NA
 8:     8                 NA
 9:     9                 NA
10:    10                 NA
11:    11               TRUE
12:    12                 NA
13:    13               TRUE
14:    14                 NA
15:    15               TRUE
16:    16                 NA
17:    17                 NA
18:    18                 NA
19:    19                 NA
20:    20                 NA
21:    21                 NA
22:    22                 NA
23:    23               TRUE
24:    24                 NA
25:    25                 NA
26:    26                 NA
27:    27                 NA
28:    28                 NA
29:    29                 NA
30:    30                 NA
31:    31                 NA
32:    32                 NA
33:    33                 NA
34:    34                 NA
35:    35                 NA
36:    36                 NA
37:    37               TRUE
38:    38                 NA
39:    39                 NA
40:    40                 NA
41:    41                 NA
42:    42               TRUE
43:    43                 NA
44:    44                 NA
45:    45               TRUE
46:    46                 NA
47:    47                 NA
48:    48                 NA
49:    49                 NA
50:    50                 NA
    

总而言之:值 TRUE 应该只出现在第 42 和 45 行,因为这些失败的传球导致对手成功拦截。

这里有一个 tidyverse 您也可以使用的解决方案:

library(dplyr)

df1 %>%
  mutate(to_turnover = ifelse((type_name == "pass" & result_name == "fail") & 
                                (lead(type_name) == "interception" & lead(result_name) == "success"), 
                              TRUE, NA))

这里有一个data.table方法

library(data.table)
setDT(df1)
df1[type_name == "pass" &
    result_name == "fail" & 
    shift(type_name, type = "lead") == "interception" & 
    shift(result_name, type = "lead") == "success", 
    to_turnover := TRUE]