Калькулятор Duckworth-Lewis-Stern для расчета пересмотренной цели - PullRequest
0 голосов
/ 25 июня 2019

В продолжение Кубка мира по крикету я хотел создать собственный калькулятор Duckworth-Lewis для One Day Internationals, используя R.

Это задача, которую я поставил перед собой, чтобы заставить меня лучше понять R и то, что я мог сделать. Duckworth-Lewis - это алгоритм, используемый в крикете, когда неожиданные задержки (особенно плохая погода) занимают центральное место. Алгоритм (в One Day Internationals) включает в себя вычисление номинальной оценки команды 2, в которой «цель команды 2» равна «оценке команды 1», умноженной на отношение «ресурсов команды 2» и «ресурсов команды 1», и мы добавляем 1 к найти цель (иначе это создаст место для сценария Кубка мира 2003 года в Южной Африке).

team2_target = function(team1_score, team1_resources, team2_resources) {
  return((team1_score * (team2_resources/team1_resources) + 1)
}

Я хочу, чтобы моя функция использовала количество потерянных калиток, а также оставшиеся кадры для вычисления переменной «Ресурсы команды 2». Например, если команда 1 набрала 277 из полных 50 оверов, а команда 2 набрала 240 с потерей 4 калиток после 40 оверов, я хочу использовать «Перемены» и «Потерянные калитки» в качестве переменных. Это звучит очень просто, но оба эти фактора имеют значение, и если любая из моих желаемых переменных изменится, сама переменная team2_resources изменится.

1 Ответ

0 голосов
/ 25 июня 2019

Вот один из способов сделать то, что вам нужно.

Сначала я использую функцию для поиска ресурсов команды 2 из таблицы Excel (вам нужно изменить путь к файлу, где бы вы ни хранили DuckworthLewisStern.xlsx).Я использую dplyr функции для поиска.См. этот вопрос SO для получения дополнительной информации и это об обновлениях предложений в пакете rlang.

Затем я беру выходные данные этой функции и передаю их вваша team2_target функция, чтобы получить целевое значение для примера ситуации 1 потерянной калитки и 37 оставшихся оверов.

library(dplyr)
DLdf <- readxl::read_xlsx("~/Downloads/DuckworthLewisStern.xlsx")

head(DLdf)

# A tibble: 6 x 11
  `Wickets Lost`    `0`    `1`    `2`    `3`    `4`    `5`    `6`   `7`    `8`    `9`
  <chr>           <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>  <dbl>  <dbl>
1 Overs Left     NA     NA     NA     NA     NA     NA     NA     NA    NA     NA    
2 50              1      0.934  0.851  0.749  0.627  0.49   0.349  0.22  0.119  0.047
3 49              0.991  0.926  0.845  0.744  0.625  0.489  0.349  0.22  0.119  0.047
4 48              0.981  0.917  0.838  0.74   0.622  0.488  0.349  0.22  0.119  0.047
5 47              0.971  0.909  0.832  0.735  0.619  0.486  0.349  0.22  0.119  0.047
6 46              0.961  0.9    0.825  0.73   0.616  0.485  0.348  0.22  0.119  0.047

# a function to look up team 2's resources

get_team2_resources <- function(wickets_lost, overs_left) {

  # convert the input arguments so we can use them in the filtering and selecting below
  wl <- as_label(enquo(wickets_lost))
  ol <- as.character(overs_left)

# do the filtering to get the value we want
  DLdf %>% 
    filter(`Wickets Lost` == ol) %>% 
    select(wl) %>% 
    pull() 
}

# your existing team2_target function
team2_target = function(team1_score, team2_resources) {
  return((team1_score * team2_resources) + 1)
}

# EXAMPLE: what are the team 2 resources when 1 wicket is lost and 37 overs are left?
t2res <- get_team2_resources(wickets_lost = 1, overs_left = 37)
t2res
[1] 0.809

# what is the team 2 target when team 1 have scored 100?
team2_target(team1_score = 100, team2_resources = t2res)
[1] 81.9

...