R:针对特定玩家生成赢/输记录表
假设我有以下数据:R:针对特定玩家生成赢/输记录表,r,dplyr,R,Dplyr,假设我有以下数据: 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) 我想使用“groupby”来处理joe游戏的语料库,但不知道如何实现条件groupby,例如,如果p1或p2==joe,则groupby joe。如果这两个条件中的任何一个都是真的,我可以变异来创建一个等于1的虚拟列,然后按此分组,但我希望有一个更节省的策略。然后,我
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)
我想使用“groupby”来处理joe游戏的语料库,但不知道如何实现条件groupby,例如,如果p1或p2==joe,则groupby joe。如果这两个条件中的任何一个都是真的,我可以变异来创建一个等于1的虚拟列,然后按此分组,但我希望有一个更节省的策略。然后,我能看到的计算乔的“胜利”的唯一方法是使用ifelse语句,如果p1==Joe和outcome==1-0或p2==Joe和outcome==0-1,那么就把这算作乔的胜利。但是,不确定如何在dplyr管道中执行这些if语句。这将是一个dplyr解决方案,允许jon和其他玩家之间进行多场游戏,而不仅仅是一场游戏。它基本上过滤乔恩参与的所有游戏,并通过变异和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)
我必须添加as.character mutate以正确返回ifelse中的对手。否则变量p1和p2仍将是因子,返回的数字将代替标签,即球员姓名。这将是一个dplyr解决方案,允许jon和其他球员之间进行多场比赛,而不仅仅是一场比赛。它基本上过滤乔恩参与的所有游戏,并通过变异和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)
我必须添加as.character mutate以正确返回ifelse中的对手。否则,变量p1和p2仍然是因子,返回的数字将代替标签,即球员的姓名。这里有一个替代的tidyverse解决方案:
# example data
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, stringsAsFactors=F)
library(tidyverse)
# reshape your dataset
dat2 = dat %>%
mutate(game_id = row_number()) %>% # add game id
unite(p, p1, p2, sep="-") %>% # combine player names
separate_rows(p, outcome) # separate rows using name and scores
# get summary stats for jon
dat2 %>%
group_by(game_id) %>% # for each game id
filter("jon" %in% p) %>% # keep games that jon played
summarise(pl = p[p != "jon"], # get the name of the other player
outcome = paste0(outcome[p=="jon"], "-", outcome[p!="jon"])) # combine the scores (jon vs. other)
# # A tibble: 3 x 3
# game_id pl outcome
# <int> <chr> <chr>
# 1 1 joe 1-0
# 2 2 james 0-1
# 3 4 ken 0-1
这样称呼它:
GetSummaryStats("jon")
适合您喜欢的任何玩家。这里有一个替代的tidyverse解决方案:
# example data
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, stringsAsFactors=F)
library(tidyverse)
# reshape your dataset
dat2 = dat %>%
mutate(game_id = row_number()) %>% # add game id
unite(p, p1, p2, sep="-") %>% # combine player names
separate_rows(p, outcome) # separate rows using name and scores
# get summary stats for jon
dat2 %>%
group_by(game_id) %>% # for each game id
filter("jon" %in% p) %>% # keep games that jon played
summarise(pl = p[p != "jon"], # get the name of the other player
outcome = paste0(outcome[p=="jon"], "-", outcome[p!="jon"])) # combine the scores (jon vs. other)
# # A tibble: 3 x 3
# game_id pl outcome
# <int> <chr> <chr>
# 1 1 joe 1-0
# 2 2 james 0-1
# 3 4 ken 0-1
这样称呼它:
GetSummaryStats("jon")
对于任何你喜欢的球员。哇,这真是难以置信——而且我现在看到它是如此的直截了当。我喜欢这条线mutatePonent=ifelsep1==jon,p2,p1真的很聪明。哦,这真是难以置信——现在我看到它是如此的简单。我喜欢这句话mutatePonent=ifelsep1==jon,p2,p1真的很聪明我觉得应该是詹姆斯0-1。我觉得应该是詹姆斯0-1。哇!这也很有启发性。非常感谢,回答得很好。我正在读它-你能解释一下这行是如何工作的吗:pl=p[p!=jon]。我不知道pl是从哪里来的,你是如何索引p的,给我一个玩家,当玩家不是Jon的时候。哇!这也很有启发性。非常感谢,回答得很好。我正在读它-你能解释一下这行是如何工作的吗:pl=p[p!=jon]。我不知道pl是从哪里来的,你是怎么索引p的,给我球员,当球员不是乔恩的时候。