Как использовать fct_relevel с синтаксисом mutate_at - PullRequest
1 голос
/ 08 мая 2019

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

Решение должно позволить мне перераспределить несколько факторов (фактический набор данных имеет 20 с лишним факторов для перерасчета по-разному)

Этот ответ похоже, что он должен работать,но я явно не понимаю синтаксис должным образом.Где я ошибаюсь?

Вот пример:

library(tidyverse)

dat <- tibble (x1 = c("b", "b", "a", "c", "b"),
               x2 = c("c", "b", "c", "a", "a"),
               y = c(10, 5, 12, 3, 4)) %>% 
  mutate_at(.vars = vars(x1:x2), factor)

Я определенно имею дело с факторами

sapply(dat, class)

Но я не могу высвободить x1, яполучить следующую ошибку: f must be a factor (or character vector))

dat %>% fct_relevel(x1, "c", "b", "a")

И это то, что я в идеале хотел бы иметь возможность сделать

dat2 <- dat %>% 
  mutate_at(.vars = vars (x1:x2),
            .funs = fct_relevel("c", "b", "a"))

В тот момент, когда окончательный набор дает мне следующие ошибки:

Ошибка: невозможно создать вызов для не вызываемого объекта

Позвонить rlang::last_error(), чтобы увидеть обратный след

Дополнительно: Предупреждающее сообщение:

Неизвестные уровни в f: b, a

Я был бы очень признателен всем, кто указал, что, я уверен, является очевидной ошибкой.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Это должно работать

library(dplyr)                     
library(forcats)

dat <- dat %>% mutate_at(vars(x1:x2), ~fct_relevel(., c("c", "b", "a")))

dat$x1
#[1] b b a c b
#Levels: c b a
dat$x2
#[1] c b c a a
#Levels: c b a
0 голосов
/ 08 мая 2019

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

library(forcats)
dat <- dat %>% 
       mutate_at(.vars = vars (x1:x2),
            fct_relevel, c("c", "b", "a"))
...