Project Summary:

The project involves processing a text data file which includes the chess tournament results. The file captures the chess rating system (invented by a Minnesota statistician named Arpad Elo) for a player and the opponents he played against in 7 rounds of the tournament. Below is a snippet of the file data structure -

Project Goal:

The project goal is to be able write R code to scrape and cleanse the data from the semi-structured text file, calculate average pre-ratings of all the opponenets for a given chess player and then export the tabular data in csv format including below columns -

For the first player in the list, the information would be: Gary Hua, ON, 6.0, 1794, 1605

R Libraries:

Load necessary libraries -

library(tidyverse)
library(kableExtra)
library(stringr)
library(dplyr)
library(reshape2)

Data Processing Steps :

Below are the steps to be followed for extracting, cleansing and processing data to generate the final output -

  1. Import data into R:
rawData <- read.delim("https://raw.githubusercontent.com/soumya2g/R-CUNY-MSDS/master/DATA-607/Chess%20Tournament/Source%20Files/TournamentInfo.txt",header = FALSE, stringsAsFactors = FALSE)
head(rawData)
V1
—————————————————————————————–
Pair | Player Name |Total|Round|Round|Round|Round|Round|Round|Round|
Num | USCF ID / Rtg (Pre->Post) | Pts | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
—————————————————————————————–
1 | GARY HUA |6.0 |W 39|W 21|W 18|W 14|W 7|D 12|D 4|
ON | 15445895 / R: 1794 ->1817 |N:2 |W |B |W |B |W |B |W |
  1. Clean the row delimiters present as a series of dash (‘-’) characters and delete the resultant empty lines:
## Clean up the row delimiters
rawData <- data.frame(str_replace_all(rawData$V1,"-",""))
head(rawData)
str_replace_all.rawData.V1……….
Pair | Player Name |Total|Round|Round|Round|Round|Round|Round|Round|
Num | USCF ID / Rtg (Pre>Post) | Pts | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | GARY HUA |6.0 |W 39|W 21|W 18|W 14|W 7|D 12|D 4|
ON | 15445895 / R: 1794 >1817 |N:2 |W |B |W |B |W |B |W |
## Delete empty lines
rawData1 <- data.frame(rawData[!apply(rawData == "",1,all),])
head(rawData1)
rawData..apply.rawData……..1..all….
Pair | Player Name |Total|Round|Round|Round|Round|Round|Round|Round|
Num | USCF ID / Rtg (Pre>Post) | Pts | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | GARY HUA |6.0 |W 39|W 21|W 18|W 14|W 7|D 12|D 4|
ON | 15445895 / R: 1794 >1817 |N:2 |W |B |W |B |W |B |W |
2 | DAKSHESH DARURI |6.0 |W 63|W 58|L 4|W 17|W 16|W 20|W 7|
MI | 14598900 / R: 1553 >1663 |N:2 |B |W |B |W |B |W |B |

The data set for each player in the file can be divided between Odd and Even row numbers. So I have separated the processing of the data between Odd and Even records -

  1. Processing of Odd rows:

Odd rownumbers are extracted in a separate data frame and data is split up by the pipe(‘|’) column demiliter.

### Odd Rows 
oddRows <- rawData1 %>% dplyr::filter(row_number() %% 2 == 1)
oddRows[] <- lapply(oddRows,as.character)

### Split the data based on pipe delimiters in a list format 

oddList <- lapply(oddRows,  function(X){
  strsplit(X, "\\|")
})

### Remove addiotnal blank column at the end 
v <- oddList[[1]][[1]]
v <- v[-11]
oddList[[1]][[1]] <- v

### Convert the list into a matrix and then a data frame 
oddDf <- data.frame(matrix(unlist(oddList), nrow  = 65, byrow = T))

head(oddDf) %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
Pair Player Name Total Round Round Round Round Round Round Round
1 GARY HUA 6.0 W 39 W 21 W 18 W 14 W 7 D 12 D 4
2 DAKSHESH DARURI 6.0 W 63 W 58 L 4 W 17 W 16 W 20 W 7
3 ADITYA BAJAJ 6.0 L 8 W 61 W 25 W 21 W 11 W 13 W 12
4 PATRICK H SCHILLING 5.5 W 23 D 28 W 2 W 26 D 5 W 19 D 1
5 HANSHI ZUO 5.5 W 45 W 37 D 12 D 13 D 4 W 14 W 17
  1. Processing of Even rows:
### Even Rows 

evenRows <- rawData1 %>% dplyr::filter(row_number() %% 2 == 0)
evenRows[] <- lapply(evenRows,as.character)

### Split the data based on pipe delimiters in a list format 

evenList <- lapply(evenRows,  function(X){
  strsplit(X, "\\|")
})

### Remove addiotnal blank column at the end 
v <- evenList[[1]][[1]]
v <- v[-11]
evenList[[1]][[1]] <- v

### Convert the list into a matrix and then a data frame 
evenDf <- data.frame(matrix(unlist(evenList), nrow  = 65, byrow = T))

head(evenDf) %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
Num USCF ID / Rtg (Pre>Post) Pts 1 2 3 4 5 6 7
ON 15445895 / R: 1794 >1817 N:2 W B W B W B W
MI 14598900 / R: 1553 >1663 N:2 B W B W B W B
MI 14959604 / R: 1384 >1640 N:2 W B W B W B W
MI 12616049 / R: 1716 >1744 N:2 W B W B W B B
MI 14601533 / R: 1655 >1690 N:2 B W B W B W B
  1. Combine Odd and Even record data frames into a combined flat data frame:

Here after combining the odd and even rows, Players’s USCF_ID, Pre and Post Ratings are extracted using regular expressions and un-necessary columns are removed from the data frame.

### Combine Odd and Even records into one data frame 
tournamentTable <- data.frame(cbind(oddDf,evenDf), stringsAsFactors = FALSE)

### Convert the factor into Character for applying Regex exression 
tournamentTable$X2.1 <- as.character(tournamentTable$X2.1)

### Extract USCF_ID, Player's Pre and Post Ratings 
tournamentTable$USCF_ID <- str_extract_all(str_trim(tournamentTable$X2.1),"^(\\d+)")
tournamentTable$Player_Pre_Rating <- as.integer(str_trim(str_extract(str_extract(tournamentTable$X2.1,"[^\\d]\\d{3,4}[^\\d]"),"\\d+")))
tournamentTable$Player_Post_Rating <- as.integer(str_extract(str_extract(tournamentTable$X2.1,"(>\\s*\\d{3,4}[^\\d])"),"\\d+"))

### Strip the 1st row with column names and strip off any unnecessary columns
tournamentTable <- tournamentTable %>% dplyr::filter(row_number() != 1)
tournamentTableFinal <- tournamentTable[-c(12:20)]

### Add header record to the data frame
names(tournamentTableFinal) <- c("Player_No","Player_Name","Total_Points","Round1","Round2","Round3","Round4","Round5","Round6","Round7",
                                 "Player_State","USCF_ID","Player_Pre_Rating","Player_Post_Rating")

tournamentTableFinal %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
Player_No Player_Name Total_Points Round1 Round2 Round3 Round4 Round5 Round6 Round7 Player_State USCF_ID Player_Pre_Rating Player_Post_Rating
1 GARY HUA 6.0 W 39 W 21 W 18 W 14 W 7 D 12 D 4 ON 15445895 1794 1817
2 DAKSHESH DARURI 6.0 W 63 W 58 L 4 W 17 W 16 W 20 W 7 MI 14598900 1553 1663
3 ADITYA BAJAJ 6.0 L 8 W 61 W 25 W 21 W 11 W 13 W 12 MI 14959604 1384 1640
4 PATRICK H SCHILLING 5.5 W 23 D 28 W 2 W 26 D 5 W 19 D 1 MI 12616049 1716 1744
5 HANSHI ZUO 5.5 W 45 W 37 D 12 D 13 D 4 W 14 W 17 MI 14601533 1655 1690
6 HANSEN SONG 5.0 W 34 D 29 L 11 W 35 D 10 W 27 W 21 OH 15055204 1686 1687
7 GARY DEE SWATHELL 5.0 W 57 W 46 W 13 W 11 L 1 W 9 L 2 MI 11146376 1649 1673
8 EZEKIEL HOUGHTON 5.0 W 3 W 32 L 14 L 9 W 47 W 28 W 19 MI 15142253 1641 1657
9 STEFANO LEE 5.0 W 25 L 18 W 59 W 8 W 26 L 7 W 20 ON 14954524 1411 1564
10 ANVIT RAO 5.0 D 16 L 19 W 55 W 31 D 6 W 25 W 18 MI 14150362 1365 1544
11 CAMERON WILLIAM MC LEMAN 4.5 D 38 W 56 W 6 L 7 L 3 W 34 W 26 MI 12581589 1712 1696
12 KENNETH J TACK 4.5 W 42 W 33 D 5 W 38 H D 1 L 3 MI 12681257 1663 1670
13 TORRANCE HENRY JR 4.5 W 36 W 27 L 7 D 5 W 33 L 3 W 32 MI 15082995 1666 1662
14 BRADLEY SHAW 4.5 W 54 W 44 W 8 L 1 D 27 L 5 W 31 MI 10131499 1610 1618
15 ZACHARY JAMES HOUGHTON 4.5 D 19 L 16 W 30 L 22 W 54 W 33 W 38 MI 15619130 1220 1416
16 MIKE NIKITIN 4.0 D 10 W 15 H W 39 L 2 W 36 U MI 10295068 1604 1613
17 RONALD GRZEGORCZYK 4.0 W 48 W 41 L 26 L 2 W 23 W 22 L 5 MI 10297702 1629 1610
18 DAVID SUNDEEN 4.0 W 47 W 9 L 1 W 32 L 19 W 38 L 10 MI 11342094 1600 1600
19 DIPANKAR ROY 4.0 D 15 W 10 W 52 D 28 W 18 L 4 L 8 MI 14862333 1564 1570
20 JASON ZHENG 4.0 L 40 W 49 W 23 W 41 W 28 L 2 L 9 MI 14529060 1595 1569
21 DINH DANG BUI 4.0 W 43 L 1 W 47 L 3 W 40 W 39 L 6 ON 15495066 1563 1562
22 EUGENE L MCCLURE 4.0 W 64 D 52 L 28 W 15 H L 17 W 40 MI 12405534 1555 1529
23 ALAN BUI 4.0 L 4 W 43 L 20 W 58 L 17 W 37 W 46 ON 15030142 1363 1371
24 MICHAEL R ALDRICH 4.0 L 28 L 47 W 43 L 25 W 60 W 44 W 39 MI 13469010 1229 1300
25 LOREN SCHWIEBERT 3.5 L 9 W 53 L 3 W 24 D 34 L 10 W 47 MI 12486656 1745 1681
26 MAX ZHU 3.5 W 49 W 40 W 17 L 4 L 9 D 32 L 11 ON 15131520 1579 1564
27 GAURAV GIDWANI 3.5 W 51 L 13 W 46 W 37 D 14 L 6 U MI 14476567 1552 1539
28 SOFIA ADINA STANESCUBELLU 3.5 W 24 D 4 W 22 D 19 L 20 L 8 D 36 MI 14882954 1507 1513
29 CHIEDOZIE OKORIE 3.5 W 50 D 6 L 38 L 34 W 52 W 48 U MI 15323285 1602 1508
30 GEORGE AVERY JONES 3.5 L 52 D 64 L 15 W 55 L 31 W 61 W 50 ON 12577178 1522 1444
31 RISHI SHETTY 3.5 L 58 D 55 W 64 L 10 W 30 W 50 L 14 MI 15131618 1494 1444
32 JOSHUA PHILIP MATHEWS 3.5 W 61 L 8 W 44 L 18 W 51 D 26 L 13 ON 14073750 1441 1433
33 JADE GE 3.5 W 60 L 12 W 50 D 36 L 13 L 15 W 51 MI 14691842 1449 1421
34 MICHAEL JEFFERY THOMAS 3.5 L 6 W 60 L 37 W 29 D 25 L 11 W 52 MI 15051807 1399 1400
35 JOSHUA DAVID LEE 3.5 L 46 L 38 W 56 L 6 W 57 D 52 W 48 MI 14601397 1438 1392
36 SIDDHARTH JHA 3.5 L 13 W 57 W 51 D 33 H L 16 D 28 MI 14773163 1355 1367
37 AMIYATOSH PWNANANDAM 3.5 B L 5 W 34 L 27 H L 23 W 61 MI 15489571 980 1077
38 BRIAN LIU 3.0 D 11 W 35 W 29 L 12 H L 18 L 15 MI 15108523 1423 1439
39 JOEL R HENDON 3.0 L 1 W 54 W 40 L 16 W 44 L 21 L 24 MI 12923035 1436 1413
40 FOREST ZHANG 3.0 W 20 L 26 L 39 W 59 L 21 W 56 L 22 MI 14892710 1348 1346
41 KYLE WILLIAM MURPHY 3.0 W 59 L 17 W 58 L 20 X U U MI 15761443 1403 1341
42 JARED GE 3.0 L 12 L 50 L 57 D 60 D 61 W 64 W 56 MI 14462326 1332 1256
43 ROBERT GLEN VASEY 3.0 L 21 L 23 L 24 W 63 W 59 L 46 W 55 MI 14101068 1283 1244
44 JUSTIN D SCHILLING 3.0 B L 14 L 32 W 53 L 39 L 24 W 59 MI 15323504 1199 1199
45 DEREK YAN 3.0 L 5 L 51 D 60 L 56 W 63 D 55 W 58 MI 15372807 1242 1191
46 JACOB ALEXANDER LAVALLEY 3.0 W 35 L 7 L 27 L 50 W 64 W 43 L 23 MI 15490981 377 1076
47 ERIC WRIGHT 2.5 L 18 W 24 L 21 W 61 L 8 D 51 L 25 MI 12533115 1362 1341
48 DANIEL KHAIN 2.5 L 17 W 63 H D 52 H L 29 L 35 MI 14369165 1382 1335
49 MICHAEL J MARTIN 2.5 L 26 L 20 D 63 D 64 W 58 H U MI 12531685 1291 1259
50 SHIVAM JHA 2.5 L 29 W 42 L 33 W 46 H L 31 L 30 MI 14773178 1056 1111
51 TEJAS AYYAGARI 2.5 L 27 W 45 L 36 W 57 L 32 D 47 L 33 MI 15205474 1011 1097
52 ETHAN GUO 2.5 W 30 D 22 L 19 D 48 L 29 D 35 L 34 MI 14918803 935 1092
53 JOSE C YBARRA 2.0 H L 25 H L 44 U W 57 U MI 12578849 1393 1359
54 LARRY HODGE 2.0 L 14 L 39 L 61 B L 15 L 59 W 64 MI 12836773 1270 1200
55 ALEX KONG 2.0 L 62 D 31 L 10 L 30 B D 45 L 43 MI 15412571 1186 1163
56 MARISA RICCI 2.0 H L 11 L 35 W 45 H L 40 L 42 MI 14679887 1153 1140
57 MICHAEL LU 2.0 L 7 L 36 W 42 L 51 L 35 L 53 B MI 15113330 1092 1079
58 VIRAJ MOHILE 2.0 W 31 L 2 L 41 L 23 L 49 B L 45 MI 14700365 917 941
59 SEAN M MC CORMICK 2.0 L 41 B L 9 L 40 L 43 W 54 L 44 MI 12841036 853 878
60 JULIA SHEN 1.5 L 33 L 34 D 45 D 42 L 24 H U MI 14579262 967 984
61 JEZZEL FARKAS 1.5 L 32 L 3 W 54 L 47 D 42 L 30 L 37 ON 15771592 955 979
62 ASHWIN BALAJI 1.0 W 55 U U U U U U MI 15219542 1530 1535
63 THOMAS JOSEPH HOSMER 1.0 L 2 L 48 D 49 L 43 L 45 H U MI 15057092 1175 1125
64 BEN LI 1.0 L 22 D 30 L 31 D 49 L 46 L 42 L 54 MI 15006561 1163 1112
  1. Create a normalized data frame containing records for each round of the tournament for each of the players including their opponents rating details
### Keeping necessary columns for the Project
playerSummaryDF <- select(tournamentTableFinal, Player_No:Total_Points, Player_State:Player_Post_Rating)

playerSummaryDF %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
Player_No Player_Name Total_Points Player_State USCF_ID Player_Pre_Rating Player_Post_Rating
1 GARY HUA 6.0 ON 15445895 1794 1817
2 DAKSHESH DARURI 6.0 MI 14598900 1553 1663
3 ADITYA BAJAJ 6.0 MI 14959604 1384 1640
4 PATRICK H SCHILLING 5.5 MI 12616049 1716 1744
5 HANSHI ZUO 5.5 MI 14601533 1655 1690
6 HANSEN SONG 5.0 OH 15055204 1686 1687
7 GARY DEE SWATHELL 5.0 MI 11146376 1649 1673
8 EZEKIEL HOUGHTON 5.0 MI 15142253 1641 1657
9 STEFANO LEE 5.0 ON 14954524 1411 1564
10 ANVIT RAO 5.0 MI 14150362 1365 1544
11 CAMERON WILLIAM MC LEMAN 4.5 MI 12581589 1712 1696
12 KENNETH J TACK 4.5 MI 12681257 1663 1670
13 TORRANCE HENRY JR 4.5 MI 15082995 1666 1662
14 BRADLEY SHAW 4.5 MI 10131499 1610 1618
15 ZACHARY JAMES HOUGHTON 4.5 MI 15619130 1220 1416
16 MIKE NIKITIN 4.0 MI 10295068 1604 1613
17 RONALD GRZEGORCZYK 4.0 MI 10297702 1629 1610
18 DAVID SUNDEEN 4.0 MI 11342094 1600 1600
19 DIPANKAR ROY 4.0 MI 14862333 1564 1570
20 JASON ZHENG 4.0 MI 14529060 1595 1569
21 DINH DANG BUI 4.0 ON 15495066 1563 1562
22 EUGENE L MCCLURE 4.0 MI 12405534 1555 1529
23 ALAN BUI 4.0 ON 15030142 1363 1371
24 MICHAEL R ALDRICH 4.0 MI 13469010 1229 1300
25 LOREN SCHWIEBERT 3.5 MI 12486656 1745 1681
26 MAX ZHU 3.5 ON 15131520 1579 1564
27 GAURAV GIDWANI 3.5 MI 14476567 1552 1539
28 SOFIA ADINA STANESCUBELLU 3.5 MI 14882954 1507 1513
29 CHIEDOZIE OKORIE 3.5 MI 15323285 1602 1508
30 GEORGE AVERY JONES 3.5 ON 12577178 1522 1444
31 RISHI SHETTY 3.5 MI 15131618 1494 1444
32 JOSHUA PHILIP MATHEWS 3.5 ON 14073750 1441 1433
33 JADE GE 3.5 MI 14691842 1449 1421
34 MICHAEL JEFFERY THOMAS 3.5 MI 15051807 1399 1400
35 JOSHUA DAVID LEE 3.5 MI 14601397 1438 1392
36 SIDDHARTH JHA 3.5 MI 14773163 1355 1367
37 AMIYATOSH PWNANANDAM 3.5 MI 15489571 980 1077
38 BRIAN LIU 3.0 MI 15108523 1423 1439
39 JOEL R HENDON 3.0 MI 12923035 1436 1413
40 FOREST ZHANG 3.0 MI 14892710 1348 1346
41 KYLE WILLIAM MURPHY 3.0 MI 15761443 1403 1341
42 JARED GE 3.0 MI 14462326 1332 1256
43 ROBERT GLEN VASEY 3.0 MI 14101068 1283 1244
44 JUSTIN D SCHILLING 3.0 MI 15323504 1199 1199
45 DEREK YAN 3.0 MI 15372807 1242 1191
46 JACOB ALEXANDER LAVALLEY 3.0 MI 15490981 377 1076
47 ERIC WRIGHT 2.5 MI 12533115 1362 1341
48 DANIEL KHAIN 2.5 MI 14369165 1382 1335
49 MICHAEL J MARTIN 2.5 MI 12531685 1291 1259
50 SHIVAM JHA 2.5 MI 14773178 1056 1111
51 TEJAS AYYAGARI 2.5 MI 15205474 1011 1097
52 ETHAN GUO 2.5 MI 14918803 935 1092
53 JOSE C YBARRA 2.0 MI 12578849 1393 1359
54 LARRY HODGE 2.0 MI 12836773 1270 1200
55 ALEX KONG 2.0 MI 15412571 1186 1163
56 MARISA RICCI 2.0 MI 14679887 1153 1140
57 MICHAEL LU 2.0 MI 15113330 1092 1079
58 VIRAJ MOHILE 2.0 MI 14700365 917 941
59 SEAN M MC CORMICK 2.0 MI 12841036 853 878
60 JULIA SHEN 1.5 MI 14579262 967 984
61 JEZZEL FARKAS 1.5 ON 15771592 955 979
62 ASHWIN BALAJI 1.0 MI 15219542 1530 1535
63 THOMAS JOSEPH HOSMER 1.0 MI 15057092 1175 1125
64 BEN LI 1.0 MI 15006561 1163 1112
#### Create the Normalized data frame including details of each round and opponents ratings details based on a inner join with the base data set 
roundDetailsDF <-  
  tournamentTableFinal %>% select(Player_No, Round1:Round7) %>%
  melt(id.var=c("Player_No"), value.name="Outcome_Opp")  %>% 
  mutate( Round        = as.numeric(str_replace(variable, "Round", "")),
          Result      = str_extract(Outcome_Opp, "^\\w+"),
          Opponent_Player_No = as.numeric(str_extract(Outcome_Opp, "\\d+$"))) %>%
  select(-c(variable, Outcome_Opp)) %>%
  inner_join(select(playerSummaryDF, Player_No, Player_Pre_Rating), c("Opponent_Player_No" = "Player_No")) %>%
  select(Player_No, Round, Result, Opponent_Player_No, Player_Pre_Rating) %>%
  arrange(Player_No, Round)

### Rename Palyer_Pre_Rating to Opponent_Pre_Rating 
names(roundDetailsDF)[names(roundDetailsDF) == "Player_Pre_Rating"] <- "Opponent_Pre_Rating"

roundDetailsDF %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
Player_No Round Result Opponent_Player_No Opponent_Pre_Rating
1 1 W 39 1436
1 2 W 21 1563
1 3 W 18 1600
1 4 W 14 1610
1 5 W 7 1649
1 6 D 12 1663
1 7 D 4 1716
2 1 W 63 1175
2 2 W 58 917
2 3 L 4 1716
2 4 W 17 1629
2 5 W 16 1604
2 6 W 20 1595
2 7 W 7 1649
3 1 L 8 1641
3 2 W 61 955
3 3 W 25 1745
3 4 W 21 1563
3 5 W 11 1712
3 6 W 13 1666
3 7 W 12 1663
4 1 W 23 1363
4 2 D 28 1507
4 3 W 2 1553
4 4 W 26 1579
4 5 D 5 1655
4 6 W 19 1564
4 7 D 1 1794
5 1 W 45 1242
5 2 W 37 980
5 3 D 12 1663
5 4 D 13 1666
5 5 D 4 1716
5 6 W 14 1610
5 7 W 17 1629
6 1 W 34 1399
6 2 D 29 1602
6 3 L 11 1712
6 4 W 35 1438
6 5 D 10 1365
6 6 W 27 1552
6 7 W 21 1563
7 1 W 57 1092
7 2 W 46 377
7 3 W 13 1666
7 4 W 11 1712
7 5 L 1 1794
7 6 W 9 1411
7 7 L 2 1553
8 1 W 3 1384
8 2 W 32 1441
8 3 L 14 1610
8 4 L 9 1411
8 5 W 47 1362
8 6 W 28 1507
8 7 W 19 1564
9 1 W 25 1745
9 2 L 18 1600
9 3 W 59 853
9 4 W 8 1641
9 5 W 26 1579
9 6 L 7 1649
9 7 W 20 1595
10 1 D 16 1604
10 2 L 19 1564
10 3 W 55 1186
10 4 W 31 1494
10 5 D 6 1686
10 6 W 25 1745
10 7 W 18 1600
11 1 D 38 1423
11 2 W 56 1153
11 3 W 6 1686
11 4 L 7 1649
11 5 L 3 1384
11 6 W 34 1399
11 7 W 26 1579
12 1 W 42 1332
12 2 W 33 1449
12 3 D 5 1655
12 4 W 38 1423
12 6 D 1 1794
12 7 L 3 1384
13 1 W 36 1355
13 2 W 27 1552
13 3 L 7 1649
13 4 D 5 1655
13 5 W 33 1449
13 6 L 3 1384
13 7 W 32 1441
14 1 W 54 1270
14 2 W 44 1199
14 3 W 8 1641
14 4 L 1 1794
14 5 D 27 1552
14 6 L 5 1655
14 7 W 31 1494
15 1 D 19 1564
15 2 L 16 1604
15 3 W 30 1522
15 4 L 22 1555
15 5 W 54 1270
15 6 W 33 1449
15 7 W 38 1423
16 1 D 10 1365
16 2 W 15 1220
16 4 W 39 1436
16 5 L 2 1553
16 6 W 36 1355
17 1 W 48 1382
17 2 W 41 1403
17 3 L 26 1579
17 4 L 2 1553
17 5 W 23 1363
17 6 W 22 1555
17 7 L 5 1655
18 1 W 47 1362
18 2 W 9 1411
18 3 L 1 1794
18 4 W 32 1441
18 5 L 19 1564
18 6 W 38 1423
18 7 L 10 1365
19 1 D 15 1220
19 2 W 10 1365
19 3 W 52 935
19 4 D 28 1507
19 5 W 18 1600
19 6 L 4 1716
19 7 L 8 1641
20 1 L 40 1348
20 2 W 49 1291
20 3 W 23 1363
20 4 W 41 1403
20 5 W 28 1507
20 6 L 2 1553
20 7 L 9 1411
21 1 W 43 1283
21 2 L 1 1794
21 3 W 47 1362
21 4 L 3 1384
21 5 W 40 1348
21 6 W 39 1436
21 7 L 6 1686
22 1 W 64 1163
22 2 D 52 935
22 3 L 28 1507
22 4 W 15 1220
22 6 L 17 1629
22 7 W 40 1348
23 1 L 4 1716
23 2 W 43 1283
23 3 L 20 1595
23 4 W 58 917
23 5 L 17 1629
23 6 W 37 980
23 7 W 46 377
24 1 L 28 1507
24 2 L 47 1362
24 3 W 43 1283
24 4 L 25 1745
24 5 W 60 967
24 6 W 44 1199
24 7 W 39 1436
25 1 L 9 1411
25 2 W 53 1393
25 3 L 3 1384
25 4 W 24 1229
25 5 D 34 1399
25 6 L 10 1365
25 7 W 47 1362
26 1 W 49 1291
26 2 W 40 1348
26 3 W 17 1629
26 4 L 4 1716
26 5 L 9 1411
26 6 D 32 1441
26 7 L 11 1712
27 1 W 51 1011
27 2 L 13 1666
27 3 W 46 377
27 4 W 37 980
27 5 D 14 1610
27 6 L 6 1686
28 1 W 24 1229
28 2 D 4 1716
28 3 W 22 1555
28 4 D 19 1564
28 5 L 20 1595
28 6 L 8 1641
28 7 D 36 1355
29 1 W 50 1056
29 2 D 6 1686
29 3 L 38 1423
29 4 L 34 1399
29 5 W 52 935
29 6 W 48 1382
30 1 L 52 935
30 2 D 64 1163
30 3 L 15 1220
30 4 W 55 1186
30 5 L 31 1494
30 6 W 61 955
30 7 W 50 1056
31 1 L 58 917
31 2 D 55 1186
31 3 W 64 1163
31 4 L 10 1365
31 5 W 30 1522
31 6 W 50 1056
31 7 L 14 1610
32 1 W 61 955
32 2 L 8 1641
32 3 W 44 1199
32 4 L 18 1600
32 5 W 51 1011
32 6 D 26 1579
32 7 L 13 1666
33 1 W 60 967
33 2 L 12 1663
33 3 W 50 1056
33 4 D 36 1355
33 5 L 13 1666
33 6 L 15 1220
33 7 W 51 1011
34 1 L 6 1686
34 2 W 60 967
34 3 L 37 980
34 4 W 29 1602
34 5 D 25 1745
34 6 L 11 1712
34 7 W 52 935
35 1 L 46 377
35 2 L 38 1423
35 3 W 56 1153
35 4 L 6 1686
35 5 W 57 1092
35 6 D 52 935
35 7 W 48 1382
36 1 L 13 1666
36 2 W 57 1092
36 3 W 51 1011
36 4 D 33 1449
36 6 L 16 1604
36 7 D 28 1507
37 2 L 5 1655
37 3 W 34 1399
37 4 L 27 1552
37 6 L 23 1363
37 7 W 61 955
38 1 D 11 1712
38 2 W 35 1438
38 3 W 29 1602
38 4 L 12 1663
38 6 L 18 1600
38 7 L 15 1220
39 1 L 1 1794
39 2 W 54 1270
39 3 W 40 1348
39 4 L 16 1604
39 5 W 44 1199
39 6 L 21 1563
39 7 L 24 1229
40 1 W 20 1595
40 2 L 26 1579
40 3 L 39 1436
40 4 W 59 853
40 5 L 21 1563
40 6 W 56 1153
40 7 L 22 1555
41 1 W 59 853
41 2 L 17 1629
41 3 W 58 917
41 4 L 20 1595
42 1 L 12 1663
42 2 L 50 1056
42 3 L 57 1092
42 4 D 60 967
42 5 D 61 955
42 6 W 64 1163
42 7 W 56 1153
43 1 L 21 1563
43 2 L 23 1363
43 3 L 24 1229
43 4 W 63 1175
43 5 W 59 853
43 6 L 46 377
43 7 W 55 1186
44 2 L 14 1610
44 3 L 32 1441
44 4 W 53 1393
44 5 L 39 1436
44 6 L 24 1229
44 7 W 59 853
45 1 L 5 1655
45 2 L 51 1011
45 3 D 60 967
45 4 L 56 1153
45 5 W 63 1175
45 6 D 55 1186
45 7 W 58 917
46 1 W 35 1438
46 2 L 7 1649
46 3 L 27 1552
46 4 L 50 1056
46 5 W 64 1163
46 6 W 43 1283
46 7 L 23 1363
47 1 L 18 1600
47 2 W 24 1229
47 3 L 21 1563
47 4 W 61 955
47 5 L 8 1641
47 6 D 51 1011
47 7 L 25 1745
48 1 L 17 1629
48 2 W 63 1175
48 4 D 52 935
48 6 L 29 1602
48 7 L 35 1438
49 1 L 26 1579
49 2 L 20 1595
49 3 D 63 1175
49 4 D 64 1163
49 5 W 58 917
50 1 L 29 1602
50 2 W 42 1332
50 3 L 33 1449
50 4 W 46 377
50 6 L 31 1494
50 7 L 30 1522
51 1 L 27 1552
51 2 W 45 1242
51 3 L 36 1355
51 4 W 57 1092
51 5 L 32 1441
51 6 D 47 1362
51 7 L 33 1449
52 1 W 30 1522
52 2 D 22 1555
52 3 L 19 1564
52 4 D 48 1382
52 5 L 29 1602
52 6 D 35 1438
52 7 L 34 1399
53 2 L 25 1745
53 4 L 44 1199
53 6 W 57 1092
54 1 L 14 1610
54 2 L 39 1436
54 3 L 61 955
54 5 L 15 1220
54 6 L 59 853
54 7 W 64 1163
55 1 L 62 1530
55 2 D 31 1494
55 3 L 10 1365
55 4 L 30 1522
55 6 D 45 1242
55 7 L 43 1283
56 2 L 11 1712
56 3 L 35 1438
56 4 W 45 1242
56 6 L 40 1348
56 7 L 42 1332
57 1 L 7 1649
57 2 L 36 1355
57 3 W 42 1332
57 4 L 51 1011
57 5 L 35 1438
57 6 L 53 1393
58 1 W 31 1494
58 2 L 2 1553
58 3 L 41 1403
58 4 L 23 1363
58 5 L 49 1291
58 7 L 45 1242
59 1 L 41 1403
59 3 L 9 1411
59 4 L 40 1348
59 5 L 43 1283
59 6 W 54 1270
59 7 L 44 1199
60 1 L 33 1449
60 2 L 34 1399
60 3 D 45 1242
60 4 D 42 1332
60 5 L 24 1229
61 1 L 32 1441
61 2 L 3 1384
61 3 W 54 1270
61 4 L 47 1362
61 5 D 42 1332
61 6 L 30 1522
61 7 L 37 980
62 1 W 55 1186
63 1 L 2 1553
63 2 L 48 1382
63 3 D 49 1291
63 4 L 43 1283
63 5 L 45 1242
64 1 L 22 1555
64 2 D 30 1522
64 3 L 31 1494
64 4 D 49 1291
64 5 L 46 377
64 6 L 42 1332
64 7 L 54 1270
  1. Calculate the Average Pre-rating of the opponents for each of the chess players:
### Calculate Mean/Average Pre-Rating of Opponenets for each player 

playerSummaryDF <-  
  roundDetailsDF %>%
  group_by(Player_No) %>% summarise(Opponents_Avg_Pre_Rating = round(mean(Opponent_Pre_Rating))) %>%
  inner_join(playerSummaryDF, by="Player_No") %>%
  select(Player_Name, Player_State, Total_Points, Player_Pre_Rating, Opponents_Avg_Pre_Rating)

playerSummaryDF %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% scroll_box(width="100%",height="300px")
Player_Name Player_State Total_Points Player_Pre_Rating Opponents_Avg_Pre_Rating
GARY HUA ON 6.0 1794 1605
DAKSHESH DARURI MI 6.0 1553 1469
ADITYA BAJAJ MI 6.0 1384 1564
PATRICK H SCHILLING MI 5.5 1716 1574
HANSHI ZUO MI 5.5 1655 1501
HANSEN SONG OH 5.0 1686 1519
GARY DEE SWATHELL MI 5.0 1649 1372
EZEKIEL HOUGHTON MI 5.0 1641 1468
STEFANO LEE ON 5.0 1411 1523
ANVIT RAO MI 5.0 1365 1554
CAMERON WILLIAM MC LEMAN MI 4.5 1712 1468
KENNETH J TACK MI 4.5 1663 1506
TORRANCE HENRY JR MI 4.5 1666 1498
BRADLEY SHAW MI 4.5 1610 1515
ZACHARY JAMES HOUGHTON MI 4.5 1220 1484
MIKE NIKITIN MI 4.0 1604 1386
RONALD GRZEGORCZYK MI 4.0 1629 1499
DAVID SUNDEEN MI 4.0 1600 1480
DIPANKAR ROY MI 4.0 1564 1426
JASON ZHENG MI 4.0 1595 1411
DINH DANG BUI ON 4.0 1563 1470
EUGENE L MCCLURE MI 4.0 1555 1300
ALAN BUI ON 4.0 1363 1214
MICHAEL R ALDRICH MI 4.0 1229 1357
LOREN SCHWIEBERT MI 3.5 1745 1363
MAX ZHU ON 3.5 1579 1507
GAURAV GIDWANI MI 3.5 1552 1222
SOFIA ADINA STANESCUBELLU MI 3.5 1507 1522
CHIEDOZIE OKORIE MI 3.5 1602 1314
GEORGE AVERY JONES ON 3.5 1522 1144
RISHI SHETTY MI 3.5 1494 1260
JOSHUA PHILIP MATHEWS ON 3.5 1441 1379
JADE GE MI 3.5 1449 1277
MICHAEL JEFFERY THOMAS MI 3.5 1399 1375
JOSHUA DAVID LEE MI 3.5 1438 1150
SIDDHARTH JHA MI 3.5 1355 1388
AMIYATOSH PWNANANDAM MI 3.5 980 1385
BRIAN LIU MI 3.0 1423 1539
JOEL R HENDON MI 3.0 1436 1430
FOREST ZHANG MI 3.0 1348 1391
KYLE WILLIAM MURPHY MI 3.0 1403 1248
JARED GE MI 3.0 1332 1150
ROBERT GLEN VASEY MI 3.0 1283 1107
JUSTIN D SCHILLING MI 3.0 1199 1327
DEREK YAN MI 3.0 1242 1152
JACOB ALEXANDER LAVALLEY MI 3.0 377 1358
ERIC WRIGHT MI 2.5 1362 1392
DANIEL KHAIN MI 2.5 1382 1356
MICHAEL J MARTIN MI 2.5 1291 1286
SHIVAM JHA MI 2.5 1056 1296
TEJAS AYYAGARI MI 2.5 1011 1356
ETHAN GUO MI 2.5 935 1495
JOSE C YBARRA MI 2.0 1393 1345
LARRY HODGE MI 2.0 1270 1206
ALEX KONG MI 2.0 1186 1406
MARISA RICCI MI 2.0 1153 1414
MICHAEL LU MI 2.0 1092 1363
VIRAJ MOHILE MI 2.0 917 1391
SEAN M MC CORMICK MI 2.0 853 1319
JULIA SHEN MI 1.5 967 1330
JEZZEL FARKAS ON 1.5 955 1327
ASHWIN BALAJI MI 1.0 1530 1186
THOMAS JOSEPH HOSMER MI 1.0 1175 1350
BEN LI MI 1.0 1163 1263
  1. Export the data into csv format:
### Final Output to csv file

write.csv(playerSummaryDF, "Chess_Players_Summary.csv",row.names = FALSE)