Перебор эталонных уровней с помощью relevel () или fct_level () - PullRequest
1 голос
/ 02 июля 2019

У меня есть несколько категориальных переменных в наборе данных, где я должен вручную изменить контрольный уровень. Я хочу найти способ перебора коллекций переменных и опорных уровней, чтобы избежать десятков раз копирования и вставки.

Я пытался использовать комбинацию mutate_at и relevel, пытаясь прокрутить вектор, содержащий мои желаемые контрольные уровни. Это не сработало. Я не смог найти никаких других вопросов, касающихся конкретно итерационной части моей проблемы. Пожалуйста, обратитесь к примеру игрушек ниже.

library(tidyverse)

mtcars <- as_tibble(mtcars)

#this step is for the autofill functionality within `select`
#handy for larger collections of variables
cars_factors <- mtcars %>% select(cyl, gear, carb) %>% names()

factor_lvls <- mtcars %>% 
  mutate_at(cars_factors, factor) %>% 
  select(cars_factors) 

#Before releveling, levels are taken in ascending numerical order
factor_lvls %>% map(unique)
#> $cyl
#> [1] 6 4 8
#> Levels: 4 6 8
#> 
#> $gear
#> [1] 4 3 5
#> Levels: 3 4 5
#> 
#> $carb
#> [1] 4 1 2 3 6 8
#> Levels: 1 2 3 4 6 8

#changing reference levels
factor_lvls$cyl <- relevel(factor_lvls$cyl, ref = "8")
factor_lvls$gear <- relevel(factor_lvls$gear, ref = "5")
factor_lvls$carb <- relevel(factor_lvls$carb, ref = "3")

#note, reference level order has changed. the first level now reflects ref levels above
factor_lvls %>% map(unique)
#> $cyl
#> [1] 6 4 8
#> Levels: 8 4 6
#> 
#> $gear
#> [1] 4 3 5
#> Levels: 5 3 4
#> 
#> $carb
#> [1] 4 1 2 3 6 8
#> Levels: 3 1 2 4 6 8

#my attempt
factor_lvls %>% mutate_at(cars_factors, fct_relevel(., c("8", "5", "3")))
#> Error: `f` must be a factor (or character vector or numeric vector).

Создано в 2019-07-02 пакетом представ. (v0.2.1)

Мое намерение состоит в том, чтобы выполнить требуемое действие по изменению опорных уровней без явного копирования и вставки кода для каждого шага. Уровни этого примера являются числами, но моя настоящая проблема содержит сочетание чисел и строк, поэтому я не могу полагаться на возрастающий порядок для получения правильных опорных уровней.

1 Ответ

1 голос
/ 02 июля 2019

Поскольку вы, по сути, хотите применить разные функции к каждому столбцу, я думаю, использование map2 здесь имеет больше смысла. Как насчет

map2_df(factor_lvls %>% select(cars_factors),  c("8", "5", "3"), ~fct_relevel(.x, .y))

Это установит порядок уровней для вас. Это создаст новый data.frame, а не обновит его, поэтому, если вы хотите объединить это в какую-то другую таблицу, вы можете просто bind_cols() данные вместе.

...