Создайте новый столбец, который показывает только команду-победителя - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь создать новый столбец, в котором отображается только команда-победитель.

Вот некоторые примеры данных:

results <- data.frame(
  home_team = c("Scotland", "England", "Scotland", "England", "Scotland", "Scotland",
                "England", "Wales", "Scotland", "Scotland", "England"),
  away_team = c("England", "Scotland", "England", "Scotland", "England", "Wales",
                "Scotland", "Scotland", "England", "Wales", "Wales"),
  home_score = c(0, 4, 2, 2, 3, 4, 1, 0, 7, 9, 2),
  away_score = c(0, 2, 1, 2, 0, 0, 3, 2, 2, 0, 1),
  stringsAsFactors = FALSE
)

На данный момент это мой код:

results <- intl.football.results
first6home <- head(results$home_team)
first6away <- head(results$away_team)
homescore <- (results$home_score)
awayscore <- (results$away_score)

data.frame('winning_team' = 0, results)

for (i in 1:length(results)){
  if(homescore[i] > awayscore[i]){
    homewins <- print("home wins")
  }else if(homescore[i] == awayscore[i]){
    draw <- print("draw")
  }else{
    awaywins <- print("away team wins")
  }
}

Я думаю, что мне нужно как-то исправить «домашние выигрыши» для команды home_team.Лучший способ, которым я могу думать об этом, - найти номер строки «homewins», а затем выбрать строки, в которых находится home_team. Но как мне это сделать, если в data.frame более 30 000 строк?Извините, это может звучать просто, но я пытаюсь!

Спасибо всем за ответы, я обязательно буду их практиковать.И последнее, что если я захочу распечатать столбец победившей страны, а не «дома, в гостях или ничьей»?

Ответы [ 4 ]

4 голосов
/ 19 сентября 2019

Функция case_when в dplyr может быть хорошим способом решения этой проблемы.Кажется, это довольно близко к тому, что вы пытаетесь сделать выше, так что, надеюсь, оно достаточно интуитивно понятно.

Документация и другие примеры: https://dplyr.tidyverse.org/reference/case_when.html

Я передаю имя победившегокоманда из соответствующей строки в качестве действия, которое нужно выполнить в case_when, но вы можете передать строку символов, например, «Home Win», как я делал для ничьих, если это желаемый результат.

library(tidyverse)


d <- tibble(
        home_team = c('Scotland', 'England', 'Scotland', 'England', 
                'Scotland', 'Scotland', 'England', 'Wales'), 
        away_team = c('England', 'Scotland', 'England', 'Scotland', 
                'England', 'Wales', 'Scotland', 'Scotland'), 
        home_score = c(0, 4, 2, 2, 3, 4, 1, 0), 
        away_score = c(0, 2, 1, 2, 0, 0, 3, 2))

d %>% 
        mutate(winner = case_when(
                home_score > away_score ~ home_team, 
                away_score > home_score ~ away_team, 
                away_score == home_score ~ 'Drawn Game'))

1 голос
/ 19 сентября 2019

Просто для удовольствия, вы также можете сделать это, вычислив знак разницы очков и затем сопоставив с вектором поиска

lookup <- c('home' = 1, 'away' = -1, 'draw' = 0)
results$winner <- 
  with(results, names(lookup)[match(sign(home_score - away_score), lookup)])

results
#    home_team away_team home_score away_score winner
# 1   Scotland   England          0          0   draw
# 2    England  Scotland          4          2   home
# 3   Scotland   England          2          1   home
# 4    England  Scotland          2          2   draw
# 5   Scotland   England          3          0   home
# 6   Scotland     Wales          4          0   home
# 7    England  Scotland          1          3   away
# 8      Wales  Scotland          0          2   away
# 9   Scotland   England          7          2   home
# 10  Scotland     Wales          9          0   home
# 11   England     Wales          2          1   home
1 голос
/ 19 сентября 2019

База R:

results$who_wins <- with(results,
  ifelse(home_score > away_score, "home wins",
         ifelse(home_score < away_score, "away wins", "draw")))
results
#    home_team away_team home_score away_score  who_wins
# 1   Scotland   England          0          0      draw
# 2    England  Scotland          4          2 home wins
# 3   Scotland   England          2          1 home wins
# 4    England  Scotland          2          2      draw
# 5   Scotland   England          3          0 home wins
# 6   Scotland     Wales          4          0 home wins
# 7    England  Scotland          1          3 away wins
# 8      Wales  Scotland          0          2 away wins
# 9   Scotland   England          7          2 home wins
# 10  Scotland     Wales          9          0 home wins
# 11   England     Wales          2          1 home wins
1 голос
/ 19 сентября 2019

Одним из решений может быть использование пакета data.table для обработки ваших данных.Используя этот пакет, решение вашей проблемы будет таким (если предположить, что ничья приведет к «Т», победа на выезде в «А» и домашняя победа в «Н»)

library(data.table)

setDT(results)
results[
    , w_team := "T"][
    home_score > away_score, w_team := "H"][
    home_score < away_score, w_team := "A"]
...