R 创建一个只显示获胜团队的新列

R 创建一个只显示获胜团队的新列,r,rstudio,tidy,R,Rstudio,Tidy,我正在尝试创建一个只显示获胜团队的新专栏 以下是一些示例数据: resultsdplyr中的函数可能是解决这个问题的好方法。 它似乎非常接近你试图做的上面,所以希望它相当直观 文档和更多示例: 我在相应的行中传递获胜队的名称,作为在情况发生时要采取的行动,但你们可以传递一个字符串,例如“主场胜利”,就像我在平局中所做的那个样,若这是你们想要的结果的话 library(tidyverse) d <- tibble( home_team = c('Scotland', '

我正在尝试创建一个只显示获胜团队的新专栏

以下是一些示例数据:


resultsdplyr中的函数可能是解决这个问题的好方法。
它似乎非常接近你试图做的上面,所以希望它相当直观

文档和更多示例:

我在相应的行中传递获胜队的名称,作为在情况发生时要采取的行动,但你们可以传递一个字符串,例如“主场胜利”,就像我在平局中所做的那个样,若这是你们想要的结果的话

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

库(tidyverse)
d%
变异(胜利者=案例)(
主场得分>客场得分~主场球队,
客场得分>主场得分~客场球队,
客场得分==主场得分~‘平局’)

一种解决方案是使用
data.table
包来处理数据。使用这个方案,你的问题的解决方案是(假设平局结果是“T”,客场赢是“a”,主场赢是“H”)

库(data.table)
setDT(结果)
结果[
,w_团队:=“T”][
主场得分>客场得分,w队:=“H”][
主场得分<客场得分,w队:=“A”]
基本R:

结果$who_赢得客场得分,“主场获胜”,
ifelse(主场得分<客场得分,“客场获胜”,“平局”))
结果
#主队客场主队客场得分谁赢
#1苏格兰英格兰0平
#英格兰苏格兰队4 2主场获胜
#3苏格兰-英格兰2 1主场获胜
#4英格兰苏格兰2 2平
#5苏格兰-英格兰3 0主场获胜
#6苏格兰-威尔士4 0主场胜利
#7英格兰苏格兰1 3客场获胜
#8威尔士苏格兰0 2客场获胜
#9苏格兰英格兰7 2主场获胜
#10苏格兰-威尔士9 0主场胜利
#11英格兰威尔士队2 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

lookup请不要发布代码/数据/错误的图像:它无法复制或搜索(SEO),它会破坏屏幕阅读器,并且可能不适合某些移动设备。参考:(和)。请直接包括代码或数据(例如,
dput(head(x))
data.frame(…)
)好的,谢谢@r2evansBTW:
length(results)
计算列,而不是行。我认为应该是
1:nrow(results)
(或者更好,更具防御性:
seq_len(nrow(results))
)。哦,是的,你是对的。感谢您的帮助@r2evansI也走上了类似的道路:
sign(Reduce(“-”,results[3:4])
是的,这个也可以。哪种方法更“标准”呢?我个人认为,
case\u when
可能是最标准、最容易阅读的方法。我想,有些人可能不愿意将非base-R选项称为更标准的选项,但因为它实际上来自SQL case语句,所以我认为,一般来说,将其称为更标准的方法是公平的。
(结果,如果其他(…,主场团队,客场团队))
library(data.table)

setDT(results)
results[
    , w_team := "T"][
    home_score > away_score, w_team := "H"][
    home_score < away_score, w_team := "A"]
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