This Rmarkdown script will extract the actions and reactions from two separate csv files of second by second, sequence actions within each second, and make dummy fields for each action of each sequence of action in each second observation. The actions were manually recorded from viewing frame by frame actions for missed, landed, and received in the notes. The two fighters are Mazvidal and Nunez of the UFC. The files to start with can be fount at the github addresses for each file of Mazvidal’s fight with Till and Nunez’s fight with Rousey, Tate, and Pennington.

This demonstrates one way of using regular expressions or regex to extract text information into features to use in predictive analytics. The machine learning involved will be to predict if the target variable being hits landed will be accurate based on all the features extracted.

library(dplyr)
library(DT)

The original file for Mazvidal to extract dummy features of actions and sequence of actions from is what follows.

fighter <- 'Mazvidal' #fighter's name to make the csv results file

MaTi <- read.csv('wolfey.csv', header=TRUE, sep=',', na.strings=c('','NA'))

head(MaTi,15)
##    Round SecondsIntoRound SecondsLastRoundAction cmTotHitsR.X1 cmTotHitsL.X1
## 1      1                1                      1             0             0
## 2      1                4                      4             0             0
## 3      1               12                      8             1             0
## 4      1               13                      1             1             0
## 5      1               20                      8             1             0
## 6      1               37                     17             1             0
## 7      1               41                      4             2             0
## 8      1               42                      5             2             0
## 9      1               44                      2             2             0
## 10     1               46                      2             3             0
## 11     1               48                      4             3             0
## 12     1               49                      1             3             2
## 13     1               50                      1             3             2
## 14     1               55                      5             3             3
## 15     1               63                      8             3             3
##    cmTotHitsM.X1 Hits.Recvd.X1 Hits.Lnd.X1 Hits.Mssd.X1 cmTotHitsR.X2
## 1              0             0           0            0             0
## 2              0             0           0            0             0
## 3              0             1           0            0             0
## 4              0             0           0            0             0
## 5              0             0           0            0             0
## 6              0             0           0            0             0
## 7              0             1           0            0             0
## 8              0             0           0            0             0
## 9              1             0           0            1             0
## 10             1             1           0            0             0
## 11             2             0           0            1             0
## 12             2             0           2            0             2
## 13             3             0           0            1             2
## 14             3             0           1            0             3
## 15             4             0           0            1             3
##    cmTotHitsL.X2 cmTotHitsM.X2 Hits.Recvd.X2 Hits.Lnd.X2 Hits.Mssd.X2 Time
## 1              0             0             0           0            0 5:00
## 2              0             0             0           0            0 4:57
## 3              1             0             0           1            0 4:49
## 4              1             0             0           0            0 4:48
## 5              1             0             0           0            0 4:41
## 6              1             0             0           0            0 4:24
## 7              2             0             0           1            0 4:20
## 8              2             0             0           0            0 4:19
## 9              2             0             0           0            0 4:17
## 10             3             0             0           1            0 4:15
## 11             3             0             0           0            0 4:13
## 12             3             0             2           0            0 4:12
## 13             3             0             0           0            0 4:11
## 14             3             0             1           0            0 4:06
## 15             3             0             0           0            0 3:58
##                                  MasvidalFighterActionReactions
## 1                              runs in for low kick immediately
## 2                                      lands illegal groin kick
## 3                                            receives head shot
## 4                                               drops to ground
## 5                                           still on the ground
## 6                                 have been wrestling for power
## 7                                                             0
## 8                                                    both stand
## 9                                              misses R mt kick
## 10                                                            0
## 11                                           misses L head shot
## 12 lands R overhead/hook to head, lands 2nd short R jab to head
## 13                                     misses R mt kick to head
## 14                                      Lands R mt kick low leg
## 15                                     misses R mt kick to body
##                 TillFightersActionsReactions
## 1                                          0
## 2  referee pauses fight 30 seconds to regain
## 3                     lands left hit to head
## 4                                          0
## 5                        overpowering on top
## 6                           dominates on top
## 7                       lands R knee to face
## 8                              both standing
## 9                                          0
## 10                 lands L mt kick to R body
## 11                                         0
## 12                                         0
## 13                                         0
## 14            receives R low leg inside kick
## 15                  blocks R mt kick to body
##                                                                                                                                                                      notes
## 1  liverpool, England and Till (south paw) is the favorite, Masvidal (orthodox-switches) is boo'd and welcomes it, crowd sings some UK theme song most of fight and before
## 2                                                                                                                                                                     <NA>
## 3                                                                                                                                                                     <NA>
## 4                                                                                                                                                                     <NA>
## 5                                                                                                                                                                     <NA>
## 6                                                                                                                                                                     <NA>
## 7                                                                                                                                                                     <NA>
## 8                                                                                                                                                                     <NA>
## 9                                                                                                                                                                     <NA>
## 10                                                                                                                                                                    <NA>
## 11                                                                                                                                                                    <NA>
## 12                                                                                                                                                                    <NA>
## 13                                                                                                                                                                    <NA>
## 14                                                                                                                                                                    <NA>
## 15                                                                                                                                                                    <NA>

The interactive htmlwidget datatable of the above. The tables must be selected or deselected from within the top header button for column to show. Then you can scroll through the available columns or feature fields. This could take a while to display the column names or scroll. These tables produced will be wide with 182 fields or features that includes the dummy action fields this script extracts from this table’s notes on X1 and X2.

Mazvidal <- datatable(data=MaTi, rownames=FALSE,colnames=colnames(MaTi),
                        filter=list(position='top'),
                      options=list(
                        dom='Bfrtip',
                        scrollX = TRUE,
                        fixedColumns = TRUE,
                        buttons=c('colvis','csv'),
                        language=list(sSearch='Filter:')),
                      extensions=c('Buttons','Responsive','FixedColumns')
                      )
Mazvidal

The original file to extract dummy features of actions and sequence of actions for Nunez is below.

wolf <- read.csv('sara_SarahSarahEatenByWolves.csv', sep=',', 
                 header=T, na.strings=c('','NA')) 
head(wolf,15)
##    Round SecondsIntoRound SecondsLastRoundAction cmTotHitsR.X1 cmTotHitsL.X1
## 1      1               NA                     NA            NA            NA
## 2      1               NA                     NA            NA            NA
## 3      1               NA                     NA            NA            NA
## 4      1               NA                     NA            NA            NA
## 5      1               NA                     NA            NA            NA
## 6      1               NA                     NA            NA            NA
## 7      1               NA                     NA            NA            NA
## 8      1               NA                     NA            NA            NA
## 9      1               NA                     NA            NA            NA
## 10     1               NA                     NA            NA            NA
## 11     1               NA                     NA            NA            NA
## 12     1               NA                     NA            NA            NA
## 13     1               NA                     NA            NA            NA
## 14     1               NA                     NA            NA            NA
## 15     1               NA                     NA            NA            NA
##    cmTotHitsM.X1 Hits.Recvd.X1 Hits.Lnd.X1 Hits.Mssd.X1 cmTotHitsR.X2
## 1             NA            NA          NA           NA            NA
## 2             NA            NA          NA           NA            NA
## 3             NA            NA          NA           NA            NA
## 4             NA            NA          NA           NA            NA
## 5             NA            NA          NA           NA            NA
## 6             NA            NA          NA           NA            NA
## 7             NA            NA          NA           NA            NA
## 8             NA            NA          NA           NA            NA
## 9             NA            NA          NA           NA            NA
## 10            NA            NA          NA           NA            NA
## 11            NA            NA          NA           NA            NA
## 12            NA            NA          NA           NA            NA
## 13            NA            NA          NA           NA            NA
## 14            NA            NA          NA           NA            NA
## 15            NA            NA          NA           NA            NA
##    cmTotHitsL.X2 cmTotHitsM.X2 Hits.Recvd.X2 Hits.Lnd.X2 Hits.Mssd.X2 Time
## 1             NA            NA            NA          NA           NA 5:00
## 2             NA            NA            NA          NA           NA 4:59
## 3             NA            NA            NA          NA           NA 4:58
## 4             NA            NA            NA          NA           NA 4:57
## 5             NA            NA            NA          NA           NA 4:56
## 6             NA            NA            NA          NA           NA 4:55
## 7             NA            NA            NA          NA           NA 4:54
## 8             NA            NA            NA          NA           NA 4:53
## 9             NA            NA            NA          NA           NA 4:52
## 10            NA            NA            NA          NA           NA 4:51
## 11            NA            NA            NA          NA           NA 4:50
## 12            NA            NA            NA          NA           NA 4:49
## 13            NA            NA            NA          NA           NA 4:48
## 14            NA            NA            NA          NA           NA 4:47
## 15            NA            NA            NA          NA           NA 4:46
##    FighterActionReactions.X1 FightersActionsReactions.X2 Notes
## 1                       <NA>                        <NA>  Tate
## 2                       <NA>                        <NA>  Tate
## 3                       <NA>                        <NA>  Tate
## 4                       <NA>                        <NA>  Tate
## 5                       <NA>                        <NA>  Tate
## 6                       <NA>                        <NA>  Tate
## 7                       <NA>                        <NA>  Tate
## 8                       <NA>                        <NA>  Tate
## 9                       <NA>                        <NA>  Tate
## 10                      <NA>                        <NA>  Tate
## 11                      <NA>          misses R push kick  Tate
## 12                      <NA>                        <NA>  Tate
## 13                      <NA>                        <NA>  Tate
## 14                      <NA>                        <NA>  Tate
## 15                      <NA>      misses R cross to face  Tate

The following is the interactive html datatable.

Nunez <- datatable(data=wolf, rownames=FALSE,colnames=colnames(wolf),
                        filter=list(position='top'),
                      options=list(
                        dom='Bfrtip',
                        scrollX = TRUE,
                        fixedColumns = TRUE,
                        buttons=c('colvis','csv'),
                        language=list(sSearch='Filter:')),
                      extensions=c('Buttons','Responsive','FixedColumns')
                      )
Nunez

Change the columns names of Mazvidal’s fight to Nunez’s fight column names. This is because Nunez is the better version for automating this script of action feature extraction from string text.

colnames(MaTi) <- colnames(wolf)

Remove the missing observations, where no actions were noticed other than walking around or testing other opponent.Nunez’s was already removed. The actions are taken from the last two columns of actions for X1 and X2.

Added <- filter(MaTi, MaTi$FighterActionReactions.X1 !=0 | MaTi$FightersActionsReactions.X2 !=0)
head(Added[,18:19],20)
##                  FightersActionsReactions.X2
## 1                                          0
## 2  referee pauses fight 30 seconds to regain
## 3                     lands left hit to head
## 4                                          0
## 5                        overpowering on top
## 6                           dominates on top
## 7                       lands R knee to face
## 8                              both standing
## 9                                          0
## 10                 lands L mt kick to R body
## 11                                         0
## 12                                         0
## 13                                         0
## 14            receives R low leg inside kick
## 15                  blocks R mt kick to body
## 16                 takes down with leg block
## 17                                         0
## 18                              not in guard
## 19                 on top, not getting guard
## 20                                         0
##                                                                                                                                                                      Notes
## 1  liverpool, England and Till (south paw) is the favorite, Masvidal (orthodox-switches) is boo'd and welcomes it, crowd sings some UK theme song most of fight and before
## 2                                                                                                                                                                     <NA>
## 3                                                                                                                                                                     <NA>
## 4                                                                                                                                                                     <NA>
## 5                                                                                                                                                                     <NA>
## 6                                                                                                                                                                     <NA>
## 7                                                                                                                                                                     <NA>
## 8                                                                                                                                                                     <NA>
## 9                                                                                                                                                                     <NA>
## 10                                                                                                                                                                    <NA>
## 11                                                                                                                                                                    <NA>
## 12                                                                                                                                                                    <NA>
## 13                                                                                                                                                                    <NA>
## 14                                                                                                                                                                    <NA>
## 15                                                                                                                                                                    <NA>
## 16                                                                                                                                                                    <NA>
## 17                                                                                                                                                                    <NA>
## 18                                                                                                                                                                    <NA>
## 19                                                                                                                                                                    <NA>
## 20                                                                                                                                                                    <NA>

Split the vector of actions for the first fighter, X1, into sequences of actions where each new action is separated by a comma. The fighter for X1 in this case is Mazvidal, but the X2 fighter/opponent was Till to grab these observations. That will be extracted later.

Sym <- strsplit(as.character(Added$FighterActionReactions.X1), ',')

The sequence of actions capped at three actions per second observed. Where there will be a set of missed, received, and landed actions. Because not all hits attempted are landed by either. The received hits are extracted from the opponent’s landed hits for both fighters. Hence, why missed and landed actions are extracted first for X1 fighter.

sq1 <- lapply(Sym,'[',1)
sq2 <- lapply(Sym,'[',2)
sq3 <- lapply(Sym,'[',3)

These are the 1st sequence actions for X1. The received actions by X1 are going to be taken by X2s hits landed and vice versa for X2s hits received in X2s corresponding sequence of each timed second observation.

#X1 landed in first sequence
kicks_sq1 <- grep('land.*kick', sq1)
elbows_sq1 <- grep('land.*elbow', sq1)
knees_sq1 <- grep('land.*knee.+', sq1)
jab_sq1 <- grep('land.*jab', sq1)
cross_sq1 <- grep('land.*cross', sq1)
hook_sq1 <- grep('land.*hook', sq1)
upper_sq1 <- grep('land.*upp', sq1)
takedown_sq1 <- grep('land.*takedown', sq1)
hammer_sq1 <- grep('land.*hammer', sq1)

#X1 missed in 1st sequence
kicks_sq1m <- grep('miss.*kick', sq1)
elbows_sq1m <- grep('miss.*elbow', sq1)
knees_sq1m <- grep('miss.*knee.+', sq1)
jab_sq1m <- grep('miss.*jab', sq1)
cross_sq1m <- grep('miss.*cross', sq1)
hook_sq1m <- grep('miss.*hook', sq1)
upper_sq1m <- grep('miss.*upp', sq1)
takedown_sq1m <- grep('miss.*takedown', sq1)
hammer_sq1m <- grep('miss.*hammer', sq1)

These are the 2nd sequence actions for X1. The received actions by X1 are going to be taken by X2s hits landed and vice versa for X2s hits received in the corresponding sequence of each timed second observation for X2. The knee regex was originally problematic as it included the X2 fighter getting knees to the body as a land, so this was corrected with ‘.+’ to exclude zero or more characters after knee in each timed second of actions.

#X1 landed in second sequence
kicks_sq2 <- grep('land*kick', sq2)
elbows_sq2 <- grep('land.*elbow', sq2)
knees_sq2 <- grep('land.knee.+', sq2)
jab_sq2 <- grep('land.*jab', sq2)
cross_sq2 <- grep('land.*cross', sq2)
hook_sq2 <- grep('land.*hook', sq2)
upper_sq2 <- grep('land.*upp', sq2)
takedown_sq2 <- grep('land.*takedown', sq2)
hammer_sq2 <- grep('land.*hammer', sq2)

#X1 missed in 2nd sequence
kicks_sq2m <- grep('miss.*kick', sq2)
elbows_sq2m <- grep('miss.*elbow', sq2)
knees_sq2m <- grep('miss.*knee.+', sq2)
jab_sq2m <- grep('miss.*jab', sq2)
cross_sq2m <- grep('miss.*cross', sq2)
hook_sq2m <- grep('miss.*hook', sq2)
upper_sq2m <- grep('miss.*upp', sq2)
takedown_sq2m <- grep('miss.*takedown', sq2)
hammer_sq2m <- grep('miss.*hammer', sq2)

These are the 3rd sequence actions for X1. The received actions by X1 are going to be taken by X2s hits landed and vice versa for X2s hits received in X2s corresponding sequence of each timed second observation.

#X1 landed in 3rd sequence
kicks_sq3 <- grep('land.*kick', sq3)
elbows_sq3 <- grep('land.*elbow', sq3)
knees_sq3 <- grep('land.*knee.+', sq3)
jab_sq3 <- grep('land.*jab', sq3)
cross_sq3 <- grep('land.*cross', sq3)
hook_sq3 <- grep('land.*hook', sq3)
upper_sq3 <- grep('land.*upp', sq3)
takedown_sq3 <- grep('land.*takedown', sq3)
hammer_sq3 <- grep('land.*hammer', sq3)

#X1 missed in 3rd sequence
kicks_sq3m <- grep('miss.*kick', sq3)
elbows_sq3m <- grep('miss.*elbow', sq3)
knees_sq3m <- grep('miss.*knee.+', sq3)
jab_sq3m <- grep('miss.*jab', sq3)
cross_sq3m <- grep('miss.*cross', sq3)
hook_sq3m <- grep('miss.*hook', sq3)
upper_sq3m <- grep('miss.*upp', sq3)
takedown_sq3m <- grep('miss.*takedown', sq3)
hammer_sq3m <- grep('miss.*hammer', sq3)

Now make a string of sequence of actions for each timed second observation for fighter X2.

Sym2 <- strsplit(as.character(Added$FightersActionsReactions.X2), ',')

Get the three sequences of actions and reactions from this X2 sequence of actions.

sq1b <- lapply(Sym2,'[',1)
sq2b <- lapply(Sym2,'[',2)
sq3b <- lapply(Sym2,'[',3)

This is the first sequence of actions for X2, and the received is taken from X1s hits landed. The hits received by X1 will be taken from X2s hits landed.

#lands 1st sequence X2
kicks_sq1b <- grep('land.*kick', sq1b)
elbows_sq1b <- grep('land.*elbow', sq1b)
knees_sq1b <- grep('land.*knee.+', sq1b)
jab_sq1b <- grep('land.*jab', sq1b)
cross_sq1b <- grep('land.*cross', sq1b)
hook_sq1b <- grep('land.*hook', sq1b)
upper_sq1b <- grep('land.*upp', sq1b)
takedown_sq1b <- grep('land.*takedown', sq1b)
hammer_sq1b <- grep('land.*hammer', sq1b)

#received by X1 in 1st sequence equivalent to hits landed 1st seq of x2
kicks_sq1r <- grep('land.*kick', sq1b)
elbows_sq1r <- grep('land.*elbow', sq1b)
knees_sq1r <- grep('land.*knee.+', sq1b)
jab_sq1r <- grep('land.*jab', sq1b)
cross_sq1r <- grep('land.*cross', sq1b)
hook_sq1r <- grep('land.*hook', sq1b)
upper_sq1r <- grep('land.*upp', sq1b)
takedown_sq1r <- grep('land.*takedown', sq1b)
hammer_sq1r <- grep('land.*hammer', sq1b)

#missed in 1st sequence X2
kicks_sq1bm <- grep('miss.*kick', sq1b)
elbows_sq1bm <- grep('miss.*elbow', sq1b)
knees_sq1bm <- grep('miss.*knee.+', sq1b)
jab_sq1bm <- grep('miss.*jab', sq1b)
cross_sq1bm <- grep('miss.*cross', sq1b)
hook_sq1bm <- grep('miss.*hook', sq1b)
upper_sq1bm <- grep('miss.*upp', sq1b)
takedown_sq1bm <- grep('miss.*takedown', sq1b)
hammer_sq1bm <- grep('miss.*hammer', sq1b)

#received by x2 in 1st seq equivalent to lands by x1
kicks_sq1br <- grep('land.*kick', sq1)
elbows_sq1br <- grep('land.*elbow', sq1)
knees_sq1br <- grep('land.*knee.+', sq1)
jab_sq1br <- grep('land.*jab', sq1)
cross_sq1br <- grep('land.*cross', sq1)
hook_sq1br <- grep('land.*hook', sq1)
upper_sq1br <- grep('land.*upp', sq1)
takedown_sq1br <- grep('land.*takedown', sq1)
hammer_sq1br <- grep('land.*hammer', sq1)

These are the 2nd sequence of actions for X2.

kicks_sq2b <- grep('land.*kick', sq2b)
elbows_sq2b <- grep('land.*elbow', sq2b)
knees_sq2b <- grep('land.*knee.+', sq2b)
jab_sq2b <- grep('land.*jab', sq2b)
cross_sq2b <- grep('land.*cross', sq2b)
hook_sq2b <- grep('land.*hook', sq2b)
upper_sq2b <- grep('land.*upp', sq2b)
takedown_sq2b <- grep('land.*takedown', sq2b)
hammer_sq2b <- grep('land.*hammer', sq2b)

# received by X1 in 2nd sequence equivalent to hits landed by x2 seq 2
kicks_sq2r <- grep('land.*kick', sq2b)
elbows_sq2r <- grep('land.*elbow', sq2b)
knees_sq2r <- grep('land.*knee.+', sq2b)
jab_sq2r <- grep('land.*jab', sq2b)
cross_sq2r <- grep('land.*cross', sq2b)
hook_sq2r <- grep('land.*hook', sq2b)
upper_sq2r <- grep('land.*upp', sq2b)
takedown_sq2r <- grep('land.*takedown', sq2b)
hammer_sq2r <- grep('land.*hammer', sq2b)

#missed in 2nd sequence x2
kicks_sq2bm <- grep('miss.*kick', sq2b)
elbows_sq2bm <- grep('miss.*elbow', sq2b)
knees_sq2bm <- grep('miss.*knee.+', sq2b)
jab_sq2bm <- grep('miss.*jab', sq2b)
cross_sq2bm <- grep('miss.*cross', sq2b)
hook_sq2bm <- grep('miss.*hook', sq2b)
upper_sq2bm <- grep('miss.*upp', sq2b)
takedown_sq2bm <- grep('miss.*takedown', sq2b)
hammer_sq2bm <- grep('miss.*hammer', sq2b)

#received 2nd seq by x2 equivalent to hits landed by x1 in seq 2
kicks_sq2br <- grep('land.*kick', sq2)
elbows_sq2br <- grep('land.*elbow', sq2)
knees_sq2br <- grep('land.*knee.+', sq2)
jab_sq2br <- grep('land.*jab', sq2)
cross_sq2br <- grep('land.*cross', sq2)
hook_sq2br <- grep('land.*hook', sq2)
upper_sq2br <- grep('land.*upp', sq2)
takedown_sq2br <- grep('land.*takedown', sq2)
hammer_sq2br <- grep('land.*hammer', sq2)

These are the 3rd sequence of actions by X2.

kicks_sq3b <- grep('land.*kick', sq3b)
elbows_sq3b <- grep('land.*elbow', sq3b)
knees_sq3b <- grep('land.*knee.+', sq3b)
jab_sq3b <- grep('land.*jab', sq3b)
cross_sq3b <- grep('land.*cross', sq3b)
hook_sq3b <- grep('land.*hook', sq3b)
upper_sq3b <- grep('land.*upp', sq3b)
takedown_sq3b <- grep('land.*takedown', sq3b)
hammer_sq3b <- grep('land.*hammer', sq3b)

#received by X1 in 3rd sequence equivalent to hits landed by X2 in seq 3
kicks_sq3r <- grep('land.*kick', sq3b)
elbows_sq3r <- grep('land.*elbow', sq3b)
knees_sq3r <- grep('land.*knee.+', sq3b)
jab_sq3r <- grep('land.*jab', sq3b)
cross_sq3r <- grep('land.*cross', sq3b)
hook_sq3r <- grep('land.*hook', sq3b)
upper_sq3r <- grep('land.*upp', sq3b)
takedown_sq3r <- grep('land.*takedown', sq3b)
hammer_sq3r <- grep('land.*hammer', sq3b)

#missed in 3rd sequence x2
kicks_sq3bm <- grep('miss.*kick', sq3b)
elbows_sq3bm <- grep('miss.*elbow', sq3b)
knees_sq3bm <- grep('miss.*knee.+', sq3b)
jab_sq3bm <- grep('miss.*jab', sq3b)
cross_sq3bm <- grep('miss.*cross', sq3b)
hook_sq3bm <- grep('miss.*hook', sq3b)
upper_sq3bm <- grep('miss.*upp', sq3b)
takedown_sq3bm <- grep('miss.*takedown', sq3b)
hammer_sq3bm <- grep('miss.*hammer', sq3b)

#received in seq 3 by x2 equivalent to hits landed by x1 in seq3
kicks_sq3br <- grep('land.*kick', sq3)
elbows_sq3br <- grep('land.*elbow', sq3)
knees_sq3br <- grep('land.*knee.+', sq3)
jab_sq3br <- grep('land.*jab', sq3)
cross_sq3br <- grep('land.*cross', sq3)
hook_sq3br <- grep('land.*hook', sq3)
upper_sq3br <- grep('land.*upp', sq3)
takedown_sq3br <- grep('land.*takedown', sq3)
hammer_sq3br <- grep('land.*hammer', sq3)

Create the emptly or predefined values for our dummy fields of actions and reactions for each sequence of every timed second with notes these actions extracted from. There will be tables that are created from these actions into one table of all actions.

added_landed <- mutate(Added, Crossl.X1=0, Kneel.X1=0, Elbowl.X1=0, Hookl.X1=0, Jabl.X1=0, Kickl.X1=0,
                       Crossl.X2=0, Kneel.X2=0, Elbowl.X2=0, Hookl.X2=0, Jabl.X2=0, Kickl.X2=0, upperl.X1=0,
                       upperl.X2=0, takedownl.X1=0, takedownl.X2=0, hammerl.X1=0, hammerl.X2=0
                       , Cross2l.X1=0, Knee2l.X1=0, Elbow2l.X1=0, Hook2l.X1=0, Jab2l.X1=0, Kick2l.X1=0,
                       Cross2l.X2=0, Knee2l.X2=0, Elbow2l.X2=0, Hook2l.X2=0, Jab2l.X2=0, Kick2l.X2=0, upper2l.X1=0,
                       upper2l.X2=0, takedown2l.X1=0, takedown2l.X2=0, hammer2l.X1=0, hammer2l.X2=0
                       , Cross3l.X1=0, Knee3l.X1=0, Elbow3l.X1=0, Hook3l.X1=0, Jab3l.X1=0, Kick3l.X1=0,
                       Cross3l.X2=0, Knee3l.X2=0, Elbow3l.X2=0, Hook3l.X2=0, Jab3l.X2=0, Kick3l.X2=0, upper3l.X1=0,
                       upper3l.X2=0, takedown3l.X1=0, takedown3l.X2=0, hammer3l.X1=0, hammer3l.X2=0)

added_missed <- mutate(added_landed, Crossm.X1=0, Kneem.X1=0, Elbowm.X1=0, Hookm.X1=0, Jabm.X1=0, Kickm.X1=0,
                       Crossm.X2=0, Kneem.X2=0, Elbowm.X2=0, Hookm.X2=0, Jabm.X2=0, Kickm.X2=0, upperm.X1=0,
                       upperm.X2=0, takedownm.X1=0, takedownm.X2=0, hammerm.X1=0, hammerm.X2=0
                       , Cross2m.X1=0, Knee2m.X1=0, Elbow2m.X1=0, Hook2m.X1=0, Jab2m.X1=0, Kick2m.X1=0,
                       Cross2m.X2=0, Knee2m.X2=0, Elbow2m.X2=0, Hook2m.X2=0, Jab2m.X2=0, Kick2m.X2=0, upper2m.X1=0,
                       upper2m.X2=0, takedown2m.X1=0, takedown2m.X2=0, hammer2m.X1=0, hammer2m.X2=0
                       , Cross3m.X1=0, Knee3m.X1=0, Elbow3m.X1=0, Hook3m.X1=0, Jab3m.X1=0, Kick3m.X1=0,
                       Cross3m.X2=0, Knee3m.X2=0, Elbow3m.X2=0, Hook3m.X2=0, Jab3m.X2=0, Kick3m.X2=0, upper3m.X1=0,
                       upper3m.X2=0, takedown3m.X1=0, takedown3m.X2=0, hammer3m.X1=0, hammer3m.X2=0)

added_received <- mutate(added_missed, Crossr.X1=0, Kneer.X1=0, Elbowr.X1=0, Hookr.X1=0, Jabr.X1=0, Kickr.X1=0,
                         Crossr.X2=0, Kneer.X2=0, Elbowr.X2=0, Hookr.X2=0, Jabr.X2=0, Kickr.X2=0, upperr.X1=0,
                         upperr.X2=0, takedownr.X1=0, takedownr.X2=0, hammerr.X1=0, hammerr.X2=0
                         , Cross2r.X1=0, Knee2r.X1=0, Elbow2r.X1=0, Hook2r.X1=0, Jab2r.X1=0, Kick2r.X1=0,
                         Cross2r.X2=0, Knee2r.X2=0, Elbow2r.X2=0, Hook2r.X2=0, Jab2r.X2=0, Kick2r.X2=0, upper2r.X1=0,
                         upper2r.X2=0, takedown2r.X1=0, takedown2r.X2=0, hammer2r.X1=0, hammer2r.X2=0
                         , Cross3r.X1=0, Knee3r.X1=0, Elbow3r.X1=0, Hook3r.X1=0, Jab3r.X1=0, Kick3r.X1=0,
                         Cross3r.X2=0, Knee3r.X2=0, Elbow3r.X2=0, Hook3r.X2=0, Jab3r.X2=0, Kick3r.X2=0, upper3r.X1=0,
                         upper3r.X2=0, takedown3r.X1=0, takedown3r.X2=0, hammer3r.X1=0, hammer3r.X2=0)

Added <- added_received

This is the interactive htmlwidget version of the datatable.

Added_view <- datatable(data=Added, rownames=FALSE,colnames=colnames(Added),
                        filter=list(position='top'),
                      options=list(
                        dom='Bfrtip',
                        scrollX = TRUE,
                        fixedColumns = TRUE,
                        buttons=c('colvis','csv'),
                        language=list(sSearch='Filter:')),
                      extensions=c('Buttons','Responsive','FixedColumns')
                      )
Added_view

Now assign all of the regex extracted values for every action or reaction by each fighter for each timed second having some type of action into those dummy features just created.

Added[cross_sq1,'Crossl.X1'] <- 1
Added[cross_sq1b,'Crossl.X2'] <- 1
Added[hook_sq1,'Hookl.X1'] <- 1
Added[hook_sq1b,'Hookl.X2'] <- 1
Added[jab_sq1,'Jabl.X1'] <- 1
Added[jab_sq1b,'Jabl.X2'] <- 1
Added[knees_sq1,'Kneel.X1'] <- 1
Added[knees_sq1b,'Kneel.X2'] <- 1
Added[elbows_sq1,'Elbowl.X1'] <- 1
Added[elbows_sq1b,'Elbowl.X2'] <- 1
Added[kicks_sq1,'Kickl.X1'] <- 1
Added[kicks_sq1b,'Kickl.X2'] <- 1
Added[upper_sq1,'upperl.X1'] <- 1
Added[upper_sq1b,'upperl.X2'] <- 1
Added[takedown_sq1,'takedownl.X1'] <- 1
Added[takedown_sq1b,'takedownl.X2'] <- 1
Added[hammer_sq1,'hammerl.X1'] <- 1
Added[hammer_sq1b,'hammerl.X2'] <- 1

Added[cross_sq2,'Cross2l.X1'] <- 1
Added[cross_sq2b,'Cross2l.X2'] <- 1
Added[hook_sq2,'Hook2l.X1'] <- 1
Added[hook_sq2b,'Hook2l.X2'] <- 1
Added[jab_sq2,'Jab2l.X1'] <- 1
Added[jab_sq2b,'Jab2l.X2'] <- 1
Added[knees_sq2,'Knee2l.X1'] <- 1
Added[knees_sq2b,'Knee2l.X2'] <- 1
Added[elbows_sq2,'Elbow2l.X1'] <- 1
Added[elbows_sq2b,'Elbow2l.X2'] <- 1
Added[kicks_sq2,'Kick2l.X1'] <- 1
Added[kicks_sq2b,'Kick2l.X2'] <- 1
Added[upper_sq2,'upper2l.X1'] <- 1
Added[upper_sq2b,'upper2l.X2'] <- 1
Added[takedown_sq2,'takedown2l.X1'] <- 1
Added[takedown_sq2b,'takedown2l.X2'] <- 1
Added[hammer_sq2,'hammer2l.X1'] <- 1
Added[hammer_sq2b,'hammer2l.X2'] <- 1

Added[cross_sq3,'Cross3l.X1'] <- 1
Added[cross_sq3b,'Cross3l.X2'] <- 1
Added[hook_sq3,'Hook3l.X1'] <- 1
Added[hook_sq3b,'Hook3l.X2'] <- 1
Added[jab_sq3,'Jab3l.X1'] <- 1
Added[jab_sq3b,'Jab3l.X2'] <- 1
Added[knees_sq3,'Knee3l.X1'] <- 1
Added[knees_sq3b,'Knee3l.X2'] <- 1
Added[elbows_sq3,'Elbow3l.X1'] <- 1
Added[elbows_sq3b,'Elbow3l.X2'] <- 1
Added[kicks_sq3,'Kick3l.X1'] <- 1
Added[kicks_sq3b,'Kick3l.X2'] <- 1
Added[upper_sq3,'upper3l.X1'] <- 1
Added[upper_sq3b,'upper3l.X2'] <- 1
Added[takedown_sq3,'takedown3l.X1'] <- 1
Added[takedown_sq3b,'takedown3l.X2'] <- 1
Added[hammer_sq3,'hammer3l.X1'] <- 1
Added[hammer_sq3b,'hammer3l.X2'] <- 1

Added[cross_sq1m,'Crossm.X1'] <- 1
Added[cross_sq1bm,'Crossm.X2'] <- 1
Added[hook_sq1m,'Hookm.X1'] <- 1
Added[hook_sq1bm,'Hookm.X2'] <- 1
Added[jab_sq1m,'Jabm.X1'] <- 1
Added[jab_sq1bm,'Jabm.X2'] <- 1
Added[knees_sq1m,'Kneem.X1'] <- 1
Added[knees_sq1bm,'Kneem.X2'] <- 1
Added[elbows_sq1m,'Elbowm.X1'] <- 1
Added[elbows_sq1bm,'Elbowm.X2'] <- 1
Added[kicks_sq1m,'Kickm.X1'] <- 1
Added[kicks_sq1bm,'Kickm.X2'] <- 1
Added[upper_sq1m,'upperm.X1'] <- 1
Added[upper_sq1bm,'upperm.X2'] <- 1
Added[takedown_sq1m,'takedownm.X1'] <- 1
Added[takedown_sq1bm,'takedownm.X2'] <- 1
Added[hammer_sq1m,'hammerm.X1'] <- 1
Added[hammer_sq1bm,'hammerm.X2'] <- 1

Added[cross_sq2m,'Cross2m.X1'] <- 1
Added[cross_sq2bm,'Cross2m.X2'] <- 1
Added[hook_sq2m,'Hook2m.X1'] <- 1
Added[hook_sq2bm,'Hook2m.X2'] <- 1
Added[jab_sq2m,'Jab2m.X1'] <- 1
Added[jab_sq2bm,'Jab2m.X2'] <- 1
Added[knees_sq2m,'Knee2m.X1'] <- 1
Added[knees_sq2bm,'Knee2m.X2'] <- 1
Added[elbows_sq2m,'Elbow2m.X1'] <- 1
Added[elbows_sq2bm,'Elbow2m.X2'] <- 1
Added[kicks_sq2m,'Kick2m.X1'] <- 1
Added[kicks_sq2bm,'Kick2m.X2'] <- 1
Added[upper_sq2m,'upper2m.X1'] <- 1
Added[upper_sq2bm,'upper2m.X2'] <- 1
Added[takedown_sq2m,'takedown2m.X1'] <- 1
Added[takedown_sq2bm,'takedown2m.X2'] <- 1
Added[hammer_sq2m,'hammer2m.X1'] <- 1
Added[hammer_sq2bm,'hammer2m.X2'] <- 1

Added[cross_sq3m,'Cross3m.X1'] <- 1
Added[cross_sq3bm,'Cross3m.X2'] <- 1
Added[hook_sq3m,'Hook3m.X1'] <- 1
Added[hook_sq3bm,'Hook3m.X2'] <- 1
Added[jab_sq3m,'Jab3m.X1'] <- 1
Added[jab_sq3bm,'Jab3m.X2'] <- 1
Added[knees_sq3m,'Knee3m.X1'] <- 1
Added[knees_sq3bm,'Knee3m.X2'] <- 1
Added[elbows_sq3m,'Elbow3m.X1'] <- 1
Added[elbows_sq3bm,'Elbow3m.X2'] <- 1
Added[kicks_sq3m,'Kick3m.X1'] <- 1
Added[kicks_sq3bm,'Kick3m.X2'] <- 1
Added[upper_sq3m,'upper3m.X1'] <- 1
Added[upper_sq3bm,'upper3m.X2'] <- 1
Added[takedown_sq3m,'takedown3m.X1'] <- 1
Added[takedown_sq3bm,'takedown3m.X2'] <- 1
Added[hammer_sq3m,'hammer3m.X1'] <- 1
Added[hammer_sq3bm,'hammer3m.X2'] <- 1

Added[cross_sq1r,'Crossr.X1'] <- 1
Added[cross_sq1br,'Crossr.X2'] <- 1
Added[hook_sq1r,'Hookr.X1'] <- 1
Added[hook_sq1br,'Hookr.X2'] <- 1
Added[jab_sq1r,'Jabr.X1'] <- 1
Added[jab_sq1br,'Jabr.X2'] <- 1
Added[knees_sq1r,'Kneer.X1'] <- 1
Added[knees_sq1br,'Kneer.X2'] <- 1
Added[elbows_sq1r,'Elbowr.X1'] <- 1
Added[elbows_sq1br,'Elbowr.X2'] <- 1
Added[kicks_sq1r,'Kickr.X1'] <- 1
Added[kicks_sq1br,'Kickr.X2'] <- 1
Added[upper_sq1r,'upperr.X1'] <- 1
Added[upper_sq1br,'upperr.X2'] <- 1
Added[takedown_sq1r,'takedownr.X1'] <- 1
Added[takedown_sq1br,'takedownr.X2'] <- 1
Added[hammer_sq1r,'hammerr.X1'] <- 1
Added[hammer_sq1br,'hammerr.X2'] <- 1

Added[cross_sq2r,'Cross2r.X1'] <- 1
Added[cross_sq2br,'Cross2r.X2'] <- 1
Added[hook_sq2r,'Hook2r.X1'] <- 1
Added[hook_sq2br,'Hook2r.X2'] <- 1
Added[jab_sq2r,'Jab2r.X1'] <- 1
Added[jab_sq2br,'Jab2r.X2'] <- 1
Added[knees_sq2r,'Knee2r.X1'] <- 1
Added[knees_sq2br,'Knee2r.X2'] <- 1
Added[elbows_sq2r,'Elbow2r.X1'] <- 1
Added[elbows_sq2br,'Elbow2r.X2'] <- 1
Added[kicks_sq2r,'Kick2r.X1'] <- 1
Added[kicks_sq2br,'Kick2r.X2'] <- 1
Added[upper_sq2r,'upper2r.X1'] <- 1
Added[upper_sq2br,'upper2r.X2'] <- 1
Added[takedown_sq2r,'takedown2r.X1'] <- 1
Added[takedown_sq2br,'takedown2r.X2'] <- 1
Added[hammer_sq2r,'hammer2r.X1'] <- 1
Added[hammer_sq2br,'hammer2r.X2'] <- 1

Added[cross_sq3r,'Cross3r.X1'] <- 1
Added[cross_sq3br,'Cross3r.X2'] <- 1
Added[hook_sq3r,'Hook3r.X1'] <- 1
Added[hook_sq3br,'Hook3r.X2'] <- 1
Added[jab_sq3r,'Jab3r.X1'] <- 1
Added[jab_sq3br,'Jab3r.X2'] <- 1
Added[knees_sq3r,'Knee3r.X1'] <- 1
Added[knees_sq3br,'Knee3r.X2'] <- 1
Added[elbows_sq3r,'Elbow3r.X1'] <- 1
Added[elbows_sq3br,'Elbow3r.X2'] <- 1
Added[kicks_sq3r,'Kick3r.X1'] <- 1
Added[kicks_sq3br,'Kick3r.X2'] <- 1
Added[upper_sq3r,'upper3r.X1'] <- 1
Added[upper_sq3br,'upper3r.X2'] <- 1
Added[takedown_sq3r,'takedown3r.X1'] <- 1
Added[takedown_sq3br,'takedown3r.X2'] <- 1
Added[hammer_sq3r,'hammer3r.X1'] <- 1
Added[hammer_sq3br,'hammer3r.X2'] <- 1

This creates a lag of the seconds since last action using the dplyr lag().

Added1 <- Added
Added1$lastAction <- lag(Added1$SecondsIntoRound)

Added1 <- Added1[,c(1:2,182,3:181)]
Added1 <- Added1[,-4]#remove secondsLastRoundAction field
Added1$lastAction[1] <- 0
Added1$lastAction <- as.integer(Added1$lastAction)

Make sure the lastAction field is int and not num class, str() to check

last <- mutate(Added1, SecondsLastRoundAction=if_else(Added1$Round==1,
                                                       Added1$SecondsIntoRound-Added1$lastAction,
                                                       Added1$SecondsIntoRound))
last <- last[,c(1:3,182,4:181)]

Extract the column locations by the landed, missed, and received hits by each fighter.

landX1 <- colnames(last)[c(21:26,33,35,37,39:44,51,53,55,57:62,69,71,73)]
landX2 <- colnames(last)[c(27:32,34,36,38,45:50,52,54,56,63:68,70,72,74)]

missX1 <- colnames(last)[c(75:80,87,89,91,93:98,105,107,109,111:116,123,125,127)]
missX2 <- colnames(last)[c(81:86,88,90,92,99:104,106,108,110,117:122,124,126,128)]

recvX1 <- colnames(last)[c(129:134,141,143,145,147:152,159,161,163,165:170,177,179,181)]
recvX2 <- colnames(last)[c(135:140,142,144,146,153:158,160,162,164,171:176,178,180,182)]

Sum up all the actionss per fighter in each sequence of each timed second of the round.

x1l <- mutate(last, TotLandsX1=last[,21]+last[,22]+last[,23]+last[,24]+last[,25]+
                last[,26]+last[,33]+last[,35]+last[,37]+last[,39]+last[,40]+
                last[,41]+last[,42]+last[,43]+last[,44]+last[,51]+last[,53]+
                last[,55]+last[,57]+last[,58]+last[,59]+last[,60]+last[,61]+
                last[,62]+last[,69]+last[,71]+last[,73])
x1m <- mutate(x1l, TotMissedX1=last[,75]+last[,76]+last[,77]+last[,78]+last[,79]+
                last[,80]+last[,87]+last[,89]+last[,91]+last[,93]+last[,94]+
                last[,95]+last[,96]+last[,97]+last[,98]+last[,105]+last[,107]+
                last[,109]+last[,111]+last[,112]+last[,113]+last[,114]+last[,115]+
                last[,116]+last[,123]+last[,125]+last[,127])
x1r <- mutate(x1m, TotReceivedX1=last[,129]+last[,130]+last[,131]+last[,132]+last[,133]+
                last[,134]+last[,141]+last[,143]+last[,145]+last[,147]+last[,148]+
                last[,149]+last[,150]+last[,151]+last[,152]+last[,159]+last[,161]+
                last[,163]+last[,165]+last[,166]+last[,167]+last[,168]+last[,169]+
                last[,170]+last[,177]+last[,179]+last[,181])

x2l <- mutate(x1r, TotLandsX2=last[,27]+last[,28]+last[,29]+last[,30]+last[,31]+
                last[,32]+last[,34]+last[,36]+last[,38]+last[,45]+last[,46]+
                last[,47]+last[,48]+last[,49]+last[,50]+last[,52]+last[,54]+
                last[,56]+last[,63]+last[,64]+last[,65]+last[,66]+last[,67]+
                last[,68]+last[,70]+last[,72]+last[,74])
x2m <- mutate(x2l, TotMissedX2=last[,81]+last[,82]+last[,83]+last[,84]+last[,85]+
                last[,86]+last[,88]+last[,90]+last[,92]+last[,99]+last[,100]+
                last[,101]+last[,102]+last[,103]+last[,104]+last[,106]+last[,108]+
                last[,110]+last[,117]+last[,118]+last[,119]+last[,120]+last[,121]+
                last[,122]+last[,124]+last[,126]+last[,128])
x2r <- mutate(x2m, TotReceivedX2=last[,135]+last[,136]+last[,137]+last[,138]+last[,139]+
                last[,140]+last[,142]+last[,144]+last[,146]+last[,153]+last[,154]+
                last[,155]+last[,156]+last[,157]+last[,158]+last[,160]+last[,162]+
                last[,164]+last[,171]+last[,172]+last[,173]+last[,174]+last[,175]+
                last[,176]+last[,178]+last[,180]+last[,182])

Take the last table created above of the sums of actions from all the intermediary tables to get to the final table and rename it after rearranging the placement of the columns.

Added2 <- x2r[,c(1,2,3,4:7,183:185,11:13,186:188,17:182)]

This is for breaking apart the table for those instances not in the same round of the fight. If the lastAction of seconds since last action in the round is greater than the seconds into the round, then it is a new round. The following will capture the new round to recalculate sums of actions per round.This section would have to be modified for more rounds in an event.

#logical vector
break1 <- Added2$lastAction > Added2$SecondsIntoRound

#returns the row where the break occurs, or new round happens
break2 <- row.names(Added2[break1,])
bk2 <- as.numeric(break2)

#creates the split where new round occurs
split1 <- bk2[1] 

This creates intermediary tables of the splits by round to sum up the actions per round and instance of each round, calculates those sums, then combines the two tables together for those two splits in this case.

#split the 1st table to include the last observation before the break or start of the new round
Table1 <- Added2[1:(split1-1),]

#split into the 2nd table to include the new start of the round and calculate the sums
Table3 <- Added2[split1:(length(Added2$Round)),]

#calculate the actions per round for the 1st round
Table4 <- mutate(Table1, cmTotHitsR.X1=cumsum(TotReceivedX1), 
                 cmTotHitsL.X1=cumsum(TotLandsX1),
                 cmTotHitsM.X1=cumsum(TotMissedX1),
                 cmTotHitsR.X2=cumsum(TotReceivedX2),
                 cmTotHitsL.X2=cumsum(TotLandsX2),
                 cmTotHitsM.X2=cumsum(TotMissedX2))

#calculate the actions per round for the 2nd round
Table6 <- mutate(Table3, cmTotHitsR.X1=cumsum(TotReceivedX1), 
                 cmTotHitsL.X1=cumsum(TotLandsX1),
                 cmTotHitsM.X1=cumsum(TotMissedX1),
                 cmTotHitsR.X2=cumsum(TotReceivedX2),
                 cmTotHitsL.X2=cumsum(TotLandsX2),
                 cmTotHitsM.X2=cumsum(TotMissedX2))

#combine the two rounds into one table of actions calculated per round for each instance
Table7 <- rbind(Table4,Table6)

colnames(Table7)
##   [1] "Round"                       "SecondsIntoRound"           
##   [3] "lastAction"                  "SecondsLastRoundAction"     
##   [5] "cmTotHitsR.X1"               "cmTotHitsL.X1"              
##   [7] "cmTotHitsM.X1"               "TotLandsX1"                 
##   [9] "TotMissedX1"                 "TotReceivedX1"              
##  [11] "cmTotHitsR.X2"               "cmTotHitsL.X2"              
##  [13] "cmTotHitsM.X2"               "TotLandsX2"                 
##  [15] "TotMissedX2"                 "TotReceivedX2"              
##  [17] "Time"                        "FighterActionReactions.X1"  
##  [19] "FightersActionsReactions.X2" "Notes"                      
##  [21] "Crossl.X1"                   "Kneel.X1"                   
##  [23] "Elbowl.X1"                   "Hookl.X1"                   
##  [25] "Jabl.X1"                     "Kickl.X1"                   
##  [27] "Crossl.X2"                   "Kneel.X2"                   
##  [29] "Elbowl.X2"                   "Hookl.X2"                   
##  [31] "Jabl.X2"                     "Kickl.X2"                   
##  [33] "upperl.X1"                   "upperl.X2"                  
##  [35] "takedownl.X1"                "takedownl.X2"               
##  [37] "hammerl.X1"                  "hammerl.X2"                 
##  [39] "Cross2l.X1"                  "Knee2l.X1"                  
##  [41] "Elbow2l.X1"                  "Hook2l.X1"                  
##  [43] "Jab2l.X1"                    "Kick2l.X1"                  
##  [45] "Cross2l.X2"                  "Knee2l.X2"                  
##  [47] "Elbow2l.X2"                  "Hook2l.X2"                  
##  [49] "Jab2l.X2"                    "Kick2l.X2"                  
##  [51] "upper2l.X1"                  "upper2l.X2"                 
##  [53] "takedown2l.X1"               "takedown2l.X2"              
##  [55] "hammer2l.X1"                 "hammer2l.X2"                
##  [57] "Cross3l.X1"                  "Knee3l.X1"                  
##  [59] "Elbow3l.X1"                  "Hook3l.X1"                  
##  [61] "Jab3l.X1"                    "Kick3l.X1"                  
##  [63] "Cross3l.X2"                  "Knee3l.X2"                  
##  [65] "Elbow3l.X2"                  "Hook3l.X2"                  
##  [67] "Jab3l.X2"                    "Kick3l.X2"                  
##  [69] "upper3l.X1"                  "upper3l.X2"                 
##  [71] "takedown3l.X1"               "takedown3l.X2"              
##  [73] "hammer3l.X1"                 "hammer3l.X2"                
##  [75] "Crossm.X1"                   "Kneem.X1"                   
##  [77] "Elbowm.X1"                   "Hookm.X1"                   
##  [79] "Jabm.X1"                     "Kickm.X1"                   
##  [81] "Crossm.X2"                   "Kneem.X2"                   
##  [83] "Elbowm.X2"                   "Hookm.X2"                   
##  [85] "Jabm.X2"                     "Kickm.X2"                   
##  [87] "upperm.X1"                   "upperm.X2"                  
##  [89] "takedownm.X1"                "takedownm.X2"               
##  [91] "hammerm.X1"                  "hammerm.X2"                 
##  [93] "Cross2m.X1"                  "Knee2m.X1"                  
##  [95] "Elbow2m.X1"                  "Hook2m.X1"                  
##  [97] "Jab2m.X1"                    "Kick2m.X1"                  
##  [99] "Cross2m.X2"                  "Knee2m.X2"                  
## [101] "Elbow2m.X2"                  "Hook2m.X2"                  
## [103] "Jab2m.X2"                    "Kick2m.X2"                  
## [105] "upper2m.X1"                  "upper2m.X2"                 
## [107] "takedown2m.X1"               "takedown2m.X2"              
## [109] "hammer2m.X1"                 "hammer2m.X2"                
## [111] "Cross3m.X1"                  "Knee3m.X1"                  
## [113] "Elbow3m.X1"                  "Hook3m.X1"                  
## [115] "Jab3m.X1"                    "Kick3m.X1"                  
## [117] "Cross3m.X2"                  "Knee3m.X2"                  
## [119] "Elbow3m.X2"                  "Hook3m.X2"                  
## [121] "Jab3m.X2"                    "Kick3m.X2"                  
## [123] "upper3m.X1"                  "upper3m.X2"                 
## [125] "takedown3m.X1"               "takedown3m.X2"              
## [127] "hammer3m.X1"                 "hammer3m.X2"                
## [129] "Crossr.X1"                   "Kneer.X1"                   
## [131] "Elbowr.X1"                   "Hookr.X1"                   
## [133] "Jabr.X1"                     "Kickr.X1"                   
## [135] "Crossr.X2"                   "Kneer.X2"                   
## [137] "Elbowr.X2"                   "Hookr.X2"                   
## [139] "Jabr.X2"                     "Kickr.X2"                   
## [141] "upperr.X1"                   "upperr.X2"                  
## [143] "takedownr.X1"                "takedownr.X2"               
## [145] "hammerr.X1"                  "hammerr.X2"                 
## [147] "Cross2r.X1"                  "Knee2r.X1"                  
## [149] "Elbow2r.X1"                  "Hook2r.X1"                  
## [151] "Jab2r.X1"                    "Kick2r.X1"                  
## [153] "Cross2r.X2"                  "Knee2r.X2"                  
## [155] "Elbow2r.X2"                  "Hook2r.X2"                  
## [157] "Jab2r.X2"                    "Kick2r.X2"                  
## [159] "upper2r.X1"                  "upper2r.X2"                 
## [161] "takedown2r.X1"               "takedown2r.X2"              
## [163] "hammer2r.X1"                 "hammer2r.X2"                
## [165] "Cross3r.X1"                  "Knee3r.X1"                  
## [167] "Elbow3r.X1"                  "Hook3r.X1"                  
## [169] "Jab3r.X1"                    "Kick3r.X1"                  
## [171] "Cross3r.X2"                  "Knee3r.X2"                  
## [173] "Elbow3r.X2"                  "Hook3r.X2"                  
## [175] "Jab3r.X2"                    "Kick3r.X2"                  
## [177] "upper3r.X1"                  "upper3r.X2"                 
## [179] "takedown3r.X1"               "takedown3r.X2"              
## [181] "hammer3r.X1"                 "hammer3r.X2"

This section grabs those actions per fighter X1 or X2 by column location in the table Added2, then rearranges the columns by landed, missed, then received ordered by X1 then X2 in each section of columns that are actions landed, missed, or received.

landX1 <- c(21:26,33,35,37,39:44,51,53,55,57:62,69,71,73)
landX2 <- c(27:32,34,36,38,45:50,52,54,56,63:68,70,72,74)

missX1 <- c(75:80,87,89,91,93:98,105,107,109,111:116,123,125,127)
missX2 <- c(81:86,88,90,92,99:104,106,108,110,117:122,124,126,128)

recvX1 <- c(129:134,141,143,145,147:152,159,161,163,165:170,177,179,181)
recvX2 <- c(135:140,142,144,146,153:158,160,162,164,171:176,178,180,182)

Table8 <- Table7[,c(1:20,landX1,landX2,missX1,missX2,recvX1,recvX2)]

head(Table8,3)
##   Round SecondsIntoRound lastAction SecondsLastRoundAction cmTotHitsR.X1
## 1     1                1          0                      1             0
## 2     1                4          1                      3             0
## 3     1               12          4                      8             0
##   cmTotHitsL.X1 cmTotHitsM.X1 TotLandsX1 TotMissedX1 TotReceivedX1
## 1             0             0          0           0             0
## 2             1             0          1           0             0
## 3             1             0          0           0             0
##   cmTotHitsR.X2 cmTotHitsL.X2 cmTotHitsM.X2 TotLandsX2 TotMissedX2
## 1             0             0             0          0           0
## 2             1             0             0          0           0
## 3             1             0             0          0           0
##   TotReceivedX2 Time        FighterActionReactions.X1
## 1             0 5:00 runs in for low kick immediately
## 2             1 4:57         lands illegal groin kick
## 3             0 4:49               receives head shot
##                 FightersActionsReactions.X2
## 1                                         0
## 2 referee pauses fight 30 seconds to regain
## 3                    lands left hit to head
##                                                                                                                                                                     Notes
## 1 liverpool, England and Till (south paw) is the favorite, Masvidal (orthodox-switches) is boo'd and welcomes it, crowd sings some UK theme song most of fight and before
## 2                                                                                                                                                                    <NA>
## 3                                                                                                                                                                    <NA>
##   Crossl.X1 Kneel.X1 Elbowl.X1 Hookl.X1 Jabl.X1 Kickl.X1 upperl.X1 takedownl.X1
## 1         0        0         0        0       0        0         0            0
## 2         0        0         0        0       0        1         0            0
## 3         0        0         0        0       0        0         0            0
##   hammerl.X1 Cross2l.X1 Knee2l.X1 Elbow2l.X1 Hook2l.X1 Jab2l.X1 Kick2l.X1
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2l.X1 takedown2l.X1 hammer2l.X1 Cross3l.X1 Knee3l.X1 Elbow3l.X1
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3l.X1 Jab3l.X1 Kick3l.X1 upper3l.X1 takedown3l.X1 hammer3l.X1 Crossl.X2
## 1         0        0         0          0             0           0         0
## 2         0        0         0          0             0           0         0
## 3         0        0         0          0             0           0         0
##   Kneel.X2 Elbowl.X2 Hookl.X2 Jabl.X2 Kickl.X2 upperl.X2 takedownl.X2
## 1        0         0        0       0        0         0            0
## 2        0         0        0       0        0         0            0
## 3        0         0        0       0        0         0            0
##   hammerl.X2 Cross2l.X2 Knee2l.X2 Elbow2l.X2 Hook2l.X2 Jab2l.X2 Kick2l.X2
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2l.X2 takedown2l.X2 hammer2l.X2 Cross3l.X2 Knee3l.X2 Elbow3l.X2
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3l.X2 Jab3l.X2 Kick3l.X2 upper3l.X2 takedown3l.X2 hammer3l.X2 Crossm.X1
## 1         0        0         0          0             0           0         0
## 2         0        0         0          0             0           0         0
## 3         0        0         0          0             0           0         0
##   Kneem.X1 Elbowm.X1 Hookm.X1 Jabm.X1 Kickm.X1 upperm.X1 takedownm.X1
## 1        0         0        0       0        0         0            0
## 2        0         0        0       0        0         0            0
## 3        0         0        0       0        0         0            0
##   hammerm.X1 Cross2m.X1 Knee2m.X1 Elbow2m.X1 Hook2m.X1 Jab2m.X1 Kick2m.X1
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2m.X1 takedown2m.X1 hammer2m.X1 Cross3m.X1 Knee3m.X1 Elbow3m.X1
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3m.X1 Jab3m.X1 Kick3m.X1 upper3m.X1 takedown3m.X1 hammer3m.X1 Crossm.X2
## 1         0        0         0          0             0           0         0
## 2         0        0         0          0             0           0         0
## 3         0        0         0          0             0           0         0
##   Kneem.X2 Elbowm.X2 Hookm.X2 Jabm.X2 Kickm.X2 upperm.X2 takedownm.X2
## 1        0         0        0       0        0         0            0
## 2        0         0        0       0        0         0            0
## 3        0         0        0       0        0         0            0
##   hammerm.X2 Cross2m.X2 Knee2m.X2 Elbow2m.X2 Hook2m.X2 Jab2m.X2 Kick2m.X2
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2m.X2 takedown2m.X2 hammer2m.X2 Cross3m.X2 Knee3m.X2 Elbow3m.X2
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3m.X2 Jab3m.X2 Kick3m.X2 upper3m.X2 takedown3m.X2 hammer3m.X2 Crossr.X1
## 1         0        0         0          0             0           0         0
## 2         0        0         0          0             0           0         0
## 3         0        0         0          0             0           0         0
##   Kneer.X1 Elbowr.X1 Hookr.X1 Jabr.X1 Kickr.X1 upperr.X1 takedownr.X1
## 1        0         0        0       0        0         0            0
## 2        0         0        0       0        0         0            0
## 3        0         0        0       0        0         0            0
##   hammerr.X1 Cross2r.X1 Knee2r.X1 Elbow2r.X1 Hook2r.X1 Jab2r.X1 Kick2r.X1
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2r.X1 takedown2r.X1 hammer2r.X1 Cross3r.X1 Knee3r.X1 Elbow3r.X1
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3r.X1 Jab3r.X1 Kick3r.X1 upper3r.X1 takedown3r.X1 hammer3r.X1 Crossr.X2
## 1         0        0         0          0             0           0         0
## 2         0        0         0          0             0           0         0
## 3         0        0         0          0             0           0         0
##   Kneer.X2 Elbowr.X2 Hookr.X2 Jabr.X2 Kickr.X2 upperr.X2 takedownr.X2
## 1        0         0        0       0        0         0            0
## 2        0         0        0       0        1         0            0
## 3        0         0        0       0        0         0            0
##   hammerr.X2 Cross2r.X2 Knee2r.X2 Elbow2r.X2 Hook2r.X2 Jab2r.X2 Kick2r.X2
## 1          0          0         0          0         0        0         0
## 2          0          0         0          0         0        0         0
## 3          0          0         0          0         0        0         0
##   upper2r.X2 takedown2r.X2 hammer2r.X2 Cross3r.X2 Knee3r.X2 Elbow3r.X2
## 1          0             0           0          0         0          0
## 2          0             0           0          0         0          0
## 3          0             0           0          0         0          0
##   Hook3r.X2 Jab3r.X2 Kick3r.X2 upper3r.X2 takedown3r.X2 hammer3r.X2
## 1         0        0         0          0             0           0
## 2         0        0         0          0             0           0
## 3         0        0         0          0             0           0

The following is the htmlwidget version of the datatable.

t8 <- datatable(data=Table8, rownames=FALSE,colnames=colnames(Table8),
                        filter=list(position='top'),
                      options=list(
                        dom='Bfrtip',
                        scrollX = TRUE,
                        fixedColumns = TRUE,
                        buttons=c('colvis','csv'),
                        language=list(sSearch='Filter:')),
                      extensions=c('Buttons','Responsive','FixedColumns')
                      )
t8
write.csv(Table8, paste(fighter,'addedFeatures.csv', sep='_'), row.names=F)