我正在寻求关于如何思考和解决这个问题的建议。
我有一个像这样的数据框架,有很多队在多轮比赛中每轮比赛多场比赛。我希望整个赛季(=整个数据框架)计算每支球队的胜负,失误和关系。
我已经想过两种方法,但它们似乎都不正确:
我可以通过比较两个给定的分数来确定其中一个的赢/输/平局,使用if-then-else函数。但有时候比赛的另一个分数是下面的分数,有时候是上面的分数。因此使用apply
函数循环似乎不对。
或者,我可以使用dplyr
函数进行分组,并在回合中进行比较。但后来有什么功能?我不想使用类似dplyr
的总结函数似乎自然而然地使用,因为我想生成一个列,告诉我几个单元格中的每一个是否都是胜利。
请问有什么建议吗?谢谢!
答案 0 :(得分:2)
这是我的尝试。我最初使用melt()
以长格式输出数据。然后,我在group_by()
中创建了一个组变量。然后,我使用value
更改了每对的顺序,这是匹配中的分数。在mutate()
中,当两个值(两个分数)相等时,我分配了“关系”。否则,我为每一对分配了“赢”和“输”,因为获胜者排在第一位。如果您想要宽屏,可以使用dcast()
。
mydf <- data.frame(round = c("A1", "A1", "A2", "A2"),
team = c("Lincoln", "Jefferson", "Washington", "Adams"),
match1 = c(3, 2, 5, 0),
match2 = c(1, 1, 3, 1),
match3 = c(2, 4, 4, 3),
stringsAsFactors = FALSE)
melt(mydf, id.vars = c("round", "team"), variable.name = "match") %>%
group_by(round, match) %>%
arrange(desc(value)) %>%
mutate(result = { if(value[1] == value[2]){"ties"}else{
c("win", "lose")}
})
# round team match value result
# 1 A1 Lincoln match1 3 win
# 2 A1 Jefferson match1 2 lose
# 3 A1 Lincoln match2 1 ties
# 4 A1 Jefferson match2 1 ties
# 5 A1 Jefferson match3 4 win
# 6 A1 Lincoln match3 2 lose
# 7 A2 Washington match1 5 win
# 8 A2 Adams match1 0 lose
# 9 A2 Washington match2 3 win
# 10 A2 Adams match2 1 lose
# 11 A2 Washington match3 4 win
# 12 A2 Adams match3 3 lose
答案 1 :(得分:2)
您的格式相对于轮次而言相对较长但格式较宽。我会使用排名来查找每个匹配使用sapply
的每个匹配的哪个团队,每轮使用ave
:
sapply(mydf[-1:-2], function(x) ave(x, mydf[1], FUN=rank))
# match1 match2 match3
#[1,] 2 1.5 1
#[2,] 1 1.5 2
#[3,] 2 2.0 2
#[4,] 1 1.0 1
2s是胜利,1是亏损,1.5s是关系。您可以使用factor()
标记它们。
答案 2 :(得分:1)
这是另一个dplyr / tidyr选项
library(dplyr)
library(tidyr)
mydf %>%
gather(match_number, score,
match1:match3) %>%
group_by(round, match_number) %>%
mutate(percent_goals = score / sum(score),
win = percent_goals > 0.5,
tie = percent_goals == 0.5,
lose = percent_goals < 0.5) %>%
gather(outcome, test,
win, tie, lose) %>%
filter(test) %>%
count(team, outcome) %>%
spread(outcome, n, fill = 0)