Chess Tournament Results

## Download the file from GitHub and read its contents.
require("utils")
require("readtext")
## Loading required package: readtext
require("stringr")
## Loading required package: stringr
library(utils)
library(stringr)
library(readtext)

filename <- "tournamentinfo.txt"
file_git <- "https://raw.githubusercontent.com/v-sinha/data607/week_04/tournamentinfo.txt"
    
tf = download.file(file_git, filename, mode = "w")
ftext = readLines(filename, warn = FALSE)
Players <- data.frame("name" = character(),
                      "state" = character(),
                      "points" = numeric(),
                      "rating" = numeric(),
                      "ave_opp_rating" = numeric())

hdr <- 4
linenum <- hdr + 1
maxlines <- length(ftext)

## The first loop builds player information:

while (linenum < maxlines) {
    
    line1 <- ftext[linenum]
    line2 <- ftext[linenum + 1]
    linenum <- linenum + 3
    
    #print(line1)
    list1 <- unlist(str_split(line1, "\\|"))
    list2 <- unlist(str_split(line2, "\\|"))
    #print(list1)

    str1 <- unlist(str_split(list2[2], ":"))
    str2 <- unlist(str_split(str1, "\\s+"))
    
    # discard the non-integer part
    elo <- str_trim(gsub("[^[:digit:]]", " ", str2[6]))
    elo <- scan(text = elo)

    # Add player information to data frame    
    # The opponent rating information is set to 0 at this stage
    player <- data.frame(name = str_trim(list1[2]),
                         state = str_trim(list2[1]),
                         points = as.numeric(list1[3]),
                         rating = as.numeric(elo[1]),
                         ave_opp_rating = 0.0)
    
    Players <- rbind(Players, player)
}


## The second loop updates the opponent rating information:

linenum <- hdr + 1
index = 0

while (linenum < maxlines) {
    index = index + 1
    
    line1 <- ftext[linenum]
    linenum <- linenum + 3
    
    list1 <- unlist(str_split(line1, "\\|"))

    sum_opp_rating <- 0.0
    num_opponents <- 0
    for (i in 1:7) {
        rstr1 <- unlist(str_split(list1[i + 3], "\\s+"))
        
        opponent = as.integer(rstr1[2])
        
        if (is.na(opponent)) {
            # print("err1")
            # print(rstr1)
        } else {
        
            # The opponent rating information is obtained 
            # from the Players data frame updated previously.
            num_opponents = num_opponents + 1
            sum_opp_rating <- sum_opp_rating + Players$rating[[opponent]][1]
        }
    }

    if (num_opponents > 0) {
        Players$ave_opp_rating[[index]][1] <- sum_opp_rating / num_opponents
    }
}

print(Players)
##                          name state points rating ave_opp_rating
## 1                    GARY HUA    ON    6.0   1794       1605.286
## 2             DAKSHESH DARURI    MI    6.0   1553       1469.286
## 3                ADITYA BAJAJ    MI    6.0   1384       1563.571
## 4         PATRICK H SCHILLING    MI    5.5   1716       1573.571
## 5                  HANSHI ZUO    MI    5.5   1655       1500.857
## 6                 HANSEN SONG    OH    5.0   1686       1518.714
## 7           GARY DEE SWATHELL    MI    5.0   1649       1372.143
## 8            EZEKIEL HOUGHTON    MI    5.0   1641       1468.429
## 9                 STEFANO LEE    ON    5.0   1411       1523.143
## 10                  ANVIT RAO    MI    5.0   1365       1554.143
## 11   CAMERON WILLIAM MC LEMAN    MI    4.5   1712       1467.571
## 12             KENNETH J TACK    MI    4.5   1663       1506.167
## 13          TORRANCE HENRY JR    MI    4.5   1666       1497.857
## 14               BRADLEY SHAW    MI    4.5   1610       1515.000
## 15     ZACHARY JAMES HOUGHTON    MI    4.5   1220       1483.857
## 16               MIKE NIKITIN    MI    4.0   1604       1385.800
## 17         RONALD GRZEGORCZYK    MI    4.0   1629       1498.571
## 18              DAVID SUNDEEN    MI    4.0   1600       1480.000
## 19               DIPANKAR ROY    MI    4.0   1564       1426.286
## 20                JASON ZHENG    MI    4.0   1595       1410.857
## 21              DINH DANG BUI    ON    4.0   1563       1470.429
## 22           EUGENE L MCCLURE    MI    4.0   1555       1300.333
## 23                   ALAN BUI    ON    4.0   1363       1213.857
## 24          MICHAEL R ALDRICH    MI    4.0   1229       1357.000
## 25           LOREN SCHWIEBERT    MI    3.5   1745       1363.286
## 26                    MAX ZHU    ON    3.5   1579       1506.857
## 27             GAURAV GIDWANI    MI    3.5   1552       1221.667
## 28 SOFIA ADINA STANESCU-BELLU    MI    3.5   1507       1522.143
## 29           CHIEDOZIE OKORIE    MI    3.5   1602       1313.500
## 30         GEORGE AVERY JONES    ON    3.5   1522       1144.143
## 31               RISHI SHETTY    MI    3.5   1494       1259.857
## 32      JOSHUA PHILIP MATHEWS    ON    3.5   1441       1378.714
## 33                    JADE GE    MI    3.5   1449       1276.857
## 34     MICHAEL JEFFERY THOMAS    MI    3.5   1399       1375.286
## 35           JOSHUA DAVID LEE    MI    3.5   1438       1149.714
## 36              SIDDHARTH JHA    MI    3.5   1355       1388.167
## 37       AMIYATOSH PWNANANDAM    MI    3.5    980       1384.800
## 38                  BRIAN LIU    MI    3.0   1423       1539.167
## 39              JOEL R HENDON    MI    3.0   1436       1429.571
## 40               FOREST ZHANG    MI    3.0   1348       1390.571
## 41        KYLE WILLIAM MURPHY    MI    3.0   1403       1248.500
## 42                   JARED GE    MI    3.0   1332       1149.857
## 43          ROBERT GLEN VASEY    MI    3.0   1283       1106.571
## 44         JUSTIN D SCHILLING    MI    3.0   1199       1327.000
## 45                  DEREK YAN    MI    3.0   1242       1152.000
## 46   JACOB ALEXANDER LAVALLEY    MI    3.0    377       1357.714
## 47                ERIC WRIGHT    MI    2.5   1362       1392.000
## 48               DANIEL KHAIN    MI    2.5   1382       1355.800
## 49           MICHAEL J MARTIN    MI    2.5   1291       1285.800
## 50                 SHIVAM JHA    MI    2.5   1056       1296.000
## 51             TEJAS AYYAGARI    MI    2.5   1011       1356.143
## 52                  ETHAN GUO    MI    2.5    935       1494.571
## 53              JOSE C YBARRA    MI    2.0   1393       1345.333
## 54                LARRY HODGE    MI    2.0   1270       1206.167
## 55                  ALEX KONG    MI    2.0   1186       1406.000
## 56               MARISA RICCI    MI    2.0   1153       1414.400
## 57                 MICHAEL LU    MI    2.0   1092       1363.000
## 58               VIRAJ MOHILE    MI    2.0    917       1391.000
## 59          SEAN M MC CORMICK    MI    2.0    853       1319.000
## 60                 JULIA SHEN    MI    1.5    967       1330.200
## 61              JEZZEL FARKAS    ON    1.5    955       1327.286
## 62              ASHWIN BALAJI    MI    1.0   1530       1186.000
## 63       THOMAS JOSEPH HOSMER    MI    1.0   1175       1350.200
## 64                     BEN LI    MI    1.0   1163       1263.000
write.csv(Players, file = "Players.csv")