Нормализация данных с помощью dplyr mutate() приводит к несоответствиям

Я пытаюсь воспроизвести структуру из этого сообщения в блоге http://www.luishusier.com/2017/09/28/balance/ со следующим кодом, но похоже, что я получаю противоречивые результаты

library(tidyverse)
library(magrittr)

ids <- c("1617", "1516", "1415", "1314", "1213", "1112", "1011", "0910", "0809", "0708", "0607", "0506")

data <- ids %>% 
  map(function(i) {read_csv(paste0("http://www.football-data.co.uk/mmz4281/", i ,"/F1.csv")) %>% 
      select(Date:AST) %>%
      mutate(season = i)})

data <- bind_rows(data)

data <- data[complete.cases(data[ , 1:3]), ]

tmp1 <- data %>% 
  select(season, HomeTeam, FTHG:FTR,HS:AST) %>%
  rename(BP = FTHG,
         BC = FTAG,
         TP = HS,
         TC = AS,
         TCP = HST,
         TCC = AST,
         team = HomeTeam)%>%
  mutate(Pts = ifelse(FTR == "H", 3, ifelse(FTR == "A", 0, 1)), 
         Terrain = "Domicile")

tmp2 <- data %>% 
  select(season, AwayTeam, FTHG:FTR, HS:AST) %>%
  rename(BP = FTAG,
         BC = FTHG,
         TP = AS,
         TC = HS,
         TCP = AST,
         TCC = HST,
         team = AwayTeam)%>%
  mutate(Pts = ifelse(FTR == "A", 3 ,ifelse(FTR == "H", 0 , 1)),
         Terrain = "Extérieur")

tmp3 <- bind_rows(tmp1, tmp2)

l1_0517 <- tmp3 %>%
  group_by(season, team)%>%
  summarise(j = n(),
            pts = sum(Pts),
            diff_but = (sum(BP) - sum(BC)),
            diff_t_ca = (sum(TCP, na.rm = T) - sum(TCC, na.rm = T)),
            diff_t = (sum(TP, na.rm = T) - sum(TC, na.rm = T)), 
            but_p = sum(BP),
            but_c = sum(BC),
            tir_ca_p = sum(TCP, na.rm = T),
            tir_ca_c = sum(TCC, na.rm = T),
            tir_p = sum(TP, na.rm = T),
            tir_c = sum(TC, na.rm = T)) %>%
  arrange((season), desc(pts), desc(diff_but))

Затем я применяю структуру, упомянутую выше:

l1_0517 <- l1_0517 %>% 
  mutate(

    # First, see how many goals the team scores relative to the average
    norm_attack = but_p %>% divide_by(mean(but_p)) %>% 
      # Then, transform it into an unconstrained scale
      log(),
    # First, see how many goals the team concedes relative to the average
    norm_defense = but_c %>% divide_by(mean(but_c)) %>% 
      # Invert it, so a higher defense is better
      raise_to_power(-1) %>% 
      # Then, transform it into an unconstrained scale
      log(),

    # Now that we have normalized attack and defense ratings, we can compute
    # measures of quality and attacking balance

    quality = norm_attack + norm_defense,
    balance = norm_attack - norm_defense
  ) %>%
arrange(desc(norm_attack))

Когда я смотрю на столбец norm_attack, я ожидаю найти одно и то же значение для эквивалентных значений but_p, что здесь не так:

head(l1_0517, 10)

например, когда but_p имеет значение 83, строки 5 и строки 7, я получаю norm_attack в 0.5612738 и 0.5128357 соответственно.

Это нормально? Я ожидаю, что mean(l1_0517$but_p) будет исправлено и, следовательно, получит тот же результат, когда значение l1_0517$but_p будет нормализовано по журналу?

ОБНОВЛЕНИЕ

Я пытался работать над более простым примером, но я не могу воспроизвести эту проблему:

df <- tibble(a = as.integer(runif(200, 15, 100)))

df <- df %>%
  mutate(norm_a = a %>% divide_by(mean(a)) %>%
           log())

person MattnDo    schedule 22.11.2017    source источник


Ответы (1)


Я нашел решение, посмотрев на тип l1_0517

Это grouped_df, отсюда и разные результаты.

Правильный код:

l1_0517 <- tmp3 %>%
  group_by(season, team)%>%
  summarise(j = n(),
            pts = sum(Pts),
            diff_but = (sum(BP) - sum(BC)),
            diff_t_ca = (sum(TCP, na.rm = T) - sum(TCC, na.rm = T)),
            diff_t = (sum(TP, na.rm = T) - sum(TC, na.rm = T)), 
            but_p = sum(BP),
            but_c = sum(BC),
            tir_ca_p = sum(TCP, na.rm = T),
            tir_ca_c = sum(TCC, na.rm = T),
            tir_p = sum(TP, na.rm = T),
            tir_c = sum(TC, na.rm = T)) %>%
  ungroup() %>%
  arrange((season), desc(pts), desc(diff_but))
person MattnDo    schedule 22.11.2017