假设我有以下数据:
dat <- read.table(text="p1 p2 outcome
jon joe 1-0
jon james 0-1
james ken 1-0
ken jon 1-0", header=T)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 dplyr 输出某个特定玩家(例如乔恩)相对于数据框中所有其他玩家的统计数据的汇总表。所以,输出应该是:
joe: 1-0
james: 1-0
ken: 0-1
Run Code Online (Sandbox Code Playgroud)
我想使用“group_by”来处理 joe 游戏的语料库,但不知道如何实现条件 group_by(例如,如果 p1 或 p2 == joe,则为 group_by joe)。如果这两个条件中的任何一个为真,我可以变异以创建一个等于 1 的虚拟列,并进行 group_by ,但希望有一个更简洁的策略。然后,我能看到计算 Joe 的“胜利”的唯一方法是使用 ifelse 语句,其中如果 p1 == Joe 且结果 == 1-0 或 p2 == Joe 且结果 == 0-1,则将此视为乔的胜利。但是,不确定如何在 dplyr 管道中执行这些 if 语句。
这将是一种dplyr允许乔恩和其他玩家之间进行多场比赛(而不仅仅是一场比赛)的解决方案。它基本上过滤了乔恩参与的所有游戏,并通过mutate和提取对手ifelse。然后总结按对手分组后的胜负数。最后,我粘贴每个对手的总体结果,并仅选择此粘贴的列:
dat %>% mutate(p1 = as.character(p1), p2 = as.character(p2)) %>%
filter((p1 == "jon")|(p2 == "jon")) %>%
mutate(opponent= ifelse(p1 == "jon",p2,p1)) %>%
group_by(opponent) %>%
summarize(Wins = sum((outcome == "1-0" & p1 == "jon") |
(outcome == "0-1" & p2 == "jon")) ,
Losses = n() - Wins) %>%
mutate(Outcome = paste(opponent, ": ",Wins, "-", Losses)) %>%
select(Outcome)
Run Code Online (Sandbox Code Playgroud)
我必须添加as.charactermutate 才能正确返回ifelse. 否则,变量p1和p2仍将是因子,并且将返回数字而不是标签(即玩家的姓名)。