我正在尝试创建一个仅显示获胜队伍的新列。
以下是一些示例数据:
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”。我能想到的最好方法是找到“ homewins”的行号,然后选择home_team所在的行。但是,如果data.frame有30,000+行,我该怎么办?抱歉,这听起来很基础,但我正在尝试!
谢谢大家的回应,我一定会实践的。最后一件事,如果我想打印出获奖国家/地区列而不是“回家,离开或抽奖”怎么办?
答案 0 :(得分:4)
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'))
答案 1 :(得分:1)
一种解决方案是使用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"]
答案 2 :(得分:1)
基本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
答案 3 :(得分:1)
只是为了好玩,您还可以通过计算得分差异的符号,然后匹配查找向量来实现此目的
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