r语言 - 创建一个仅显示获胜团队的新列



我正在尝试创建一个仅显示获胜团队的新列。

下面是一些示例数据:

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+ 行,我该怎么做呢?对不起,这听起来很基本,但我正在尝试!

谢谢大家的回复,我一定会练习的。最后一件事,如果我想打印出获胜国家列而不是"主场、客场或平局"怎么办?

dplyr中的case_when函数可能是解决这个问题的好方法。 它似乎与您上面尝试做的事情非常接近,所以希望它非常直观。

文档和更多示例: https://dplyr.tidyverse.org/reference/case_when.html

我从相应的行中传递获胜球队的名称作为case_when中要执行的操作,但您可以传入字符串,例如"主场胜利",就像我为抽签游戏所做的那样,如果这是您想要的结果。

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'))

一种解决方案可能是使用data.table包来处理您的数据。使用此软件包,您的问题的解决方案将是(假设平局会导致"T",客场获胜"A"和主场获胜"H"(

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

Base 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

只是为了好玩,你也可以通过计算分数差异的符号,然后匹配到查找向量来做到这一点

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

最新更新