对 R 中的多列使用相同的因子映射

Using the same factor mapping for multiple columns in R

我正在尝试弄清楚如何对多个列使用相同的因子 "mapping"。

例如,这是一个虚拟网球比赛的数据集,其中一名球员是热门球员,另一名球员是弱者:

df <- tribble(
  ~game, ~favorite, ~underdog,
  #-----|----------|----------
  1,     "Mary",     "Susan",
  2,     "Susan",    "John",
  3,     "Mary",     "Joe",
  4,     "Joe",      "Dave",
  5,     "Susan",    "Dave"
)

请注意,有些宠儿永远不会处于劣势(玛丽),而处于劣势的人永远不会成为宠儿(约翰、戴夫)。

我想创建一个适用于最受欢迎和失败列的因素。例如,如果我现在输入

df %<>% mutate(favorite=factor(favorite))

然后 Joe 是 1,Mary 是 2,Susan 是 3,因为默认是按字母顺序排列。

我现在如何将失败者列更改为一个因素,以便每次乔出现在那里时,他都被分配 1,玛丽得到 2,依此类推?

我的requirements/hopes/desires:

  1. 实际上会有很多行和不同的条目,所以手工编码不是一种选择;
  2. 我希望能够在链的中间使用管道执行此操作;
  3. 最后,我希望能够 运行 像 filter(favorite=="Susan" | underdog=="Susan") 这样的代码。

我看了看,但找不到以前在哪里做过这件事。任何帮助将不胜感激。

我们可以指定levels

library(dplyr)
df%>%
   mutate(favorite = factor(favorite, levels = unique(underdog)))

如果我们需要两列都是 factor,请使用 mutate_at

df %>%
   mutate_at(vars(favorite, underdog), ~ factor(., levels = unique(underdog))) 

您可以获得 unique 名玩家,然后将其用作两列的 factor 等级。

unique_players <- unique(unlist(df[-1]))
df[-1] <- lapply(df[-1], factor, levels = unique_players)
df[-1]
# A tibble: 5 x 2
#  favorite underdog
#  <fct>    <fct>   
#1 Mary     Susan   
#2 Susan    John    
#3 Mary     Joe     
#4 Joe      Dave    
#5 Susan    Dave 

如果是管道的话

library(dplyr)    
df <- df %>% mutate_at(-1, factor, levels = unique_players)

因此,如果您将其转换为数字,相似的名称将具有相同的数字。

sapply(df[-1], as.numeric)   

#     favorite underdog
#[1,]        1        2
#[2,]        2        4
#[3,]        1        3
#[4,]        3        5
#[5,]        2        5