Использование одного и того же факторного отображения для нескольких столбцов в R - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь понять, как использовать один и тот же фактор «отображения» для более чем одного столбца.

Например, вот набор данных воображаемых теннисных матчей, в которых один игрок был фаворитом а другой игрок был аутсайдером:

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))

, то Джо равен 1, Мэри - 2, а Сьюзен - 3, поскольку по умолчанию используется алфавитный порядок.

Как я могу изменить проигравшего столбец фактора, так что каждый раз, когда Джо появляется там, ему назначают 1, Мэри получает 2, и так далее?

Мои требования / надежды / желания:

  1. На практике будет много строк и разных записей, поэтому ручное кодирование не вариант;
  2. I я хотел бы иметь возможность делать это в середине цепочки, с каналами;
  3. В конце я хотел бы иметь возможность запускать код, подобный filter(favorite=="Susan" | underdog=="Susan").

Я посмотрел, но не смог найти, где это было сделано раньше. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Вы можете получить 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)

Так что, если вы преобразуете его в число c, у вас будет тот же номер для похожих имен.

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

#     favorite underdog
#[1,]        1        2
#[2,]        2        4
#[3,]        1        3
#[4,]        3        5
#[5,]        2        5
0 голосов
/ 14 января 2020

Мы можем указать levels

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

Если нам нужно, чтобы оба столбца были factor, используйте mutate_at

df %>%
   mutate_at(vars(favorite, underdog), ~ factor(., levels = unique(underdog))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...