Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:针对特定玩家生成赢/输记录表_R_Dplyr - Fatal编程技术网

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的,给我球员,当球员不是乔恩的时候。