Перекодировать уровни нескольких факторов в указанный диапазон

У меня есть следующий фрейм данных:

library(tidyverse)
df <- tibble(a = c(1, 2, 3, 4, 5),
             b = c("Y", "N", "N", "Y", "N"),
             c = c("A", "B", "C", "A", "B"))

df <- df %>%
  mutate_if(is.character, funs(as.factor))

Вывод df:

      a b     c    
  <dbl> <fct> <fct>
1     1 Y     A    
2     2 N     B    
3     3 N     C    
4     4 Y     A    
5     5 N     B    

Я хотел бы перекодировать уровни всех факторов (переменные b и c) в целые числа: если фактор имеет только два уровня, он должен быть перекодирован в {0, 1}, иначе в уровни {1, 2, 3, ...}. Итак, вывод должен быть:

      a b     c    
  <dbl> <fct> <fct>
1     1 1     1    
2     2 0     2    
3     3 0     3    
4     4 1     1    
5     5 0     2    

Я могу перекодировать переменные отдельно (одну за другой), но мне интересно, есть ли более удобный подход.


person Andrej    schedule 20.10.2020    source источник


Ответы (2)


Одним из вариантов dplyr может быть:

df %>%
 mutate(across(where(is.factor), 
               ~ if(n_distinct(.) == 2) factor(., labels = 0:1) else factor(., labels = 1:n_distinct(.))))

      a b     c    
  <dbl> <fct> <fct>
1     1 1     1    
2     2 0     2    
3     3 0     3    
4     4 1     1    
5     5 0     2
person tmfmnk    schedule 20.10.2020

Это работает:

> library(dplyr)
> df %>% mutate(b_fac = match(b,unique(b)) - 1, c_fac = match(c, unique(c))) %>% 
+       mutate(b_fac = ifelse(b_fac == 1, 0, 1)) %>% mutate(b_fac = as.factor(b_fac), c_fac = as.factor(c_fac))  %>% 
+       select(-2,-3) %>% rename(b = b_fac, c = c_fac)
# A tibble: 5 x 3
      a b     c    
  <dbl> <fct> <fct>
1     1 1     1    
2     2 0     2    
3     3 0     3    
4     4 1     1    
5     5 0     2    
> 
person Karthik S    schedule 20.10.2020