Ошибка при свертывании фактора в группы с использованием forcats - PullRequest
0 голосов
/ 29 января 2020

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

df = data.frame(a = 1:5) %>% as_tibble()

Я хочу свернуть значения 1 и 3 в 'group1', 2 и 4 в 'group2', а другие значения (например, 5) в ' Другой'. Я думал, что fct_collapse () будет идеальной функцией, но она делает странные вещи ...

df %>% 
  mutate(
    a = as.character(a),
    a_collapse = fct_collapse(a, 
             group1=c('1', '3'),
             group2 = c('2', '4'),
             group_other = TRUE))

Тем не менее, значение 3 получило «group2» вместо «group1». Вы знаете, почему это происходит? Я предполагаю, что это связано с тем фактом, что значения моего фактора являются числовыми, но не нашли способ справиться с этим. Любая идея?

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

Заменить коэффициенты на цифры c значение

Коэффициенты объединения двух столбцов

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Простой case_when?

library(dplyr)
df %>%
  mutate(a_collapse = factor(case_when(a %in% c(1, 3)~"group1", 
                                       a %in% c(2, 4) ~"group2", 
                                       TRUE ~ 'Other')))

# A tibble: 5 x 2
#     a a_collapse
#  <int> <fct>     
#1     1 group1    
#2     2 group2    
#3     3 group1    
#4     4 group2    
#5     5 Other     

Что касается fct_collapse, то, похоже, проблема заключается в включении group_other, как указано в этом выпуске на Github. Если мы удалим его, он будет работать как положено, но не будет иметь никакого значения для других групп.

df %>% 
  mutate(
    a = as.character(a),
    a_collapse = forcats::fct_collapse(a, 
                              group1=c('1', '3'),
                              group2 = c('2', '4')))

# A tibble: 5 x 2
#   a     a_collapse
#  <chr> <fct>     
#1 1     group1    
#2 2     group2    
#3 3     group1    
#4 4     group2    
#5 5     5        

Эта ошибка была исправлена ​​в разрабатываемой версии forcats и будет доступна в следующем выпуске.

1 голос
/ 29 января 2020

Вот альтернатива, используя dplyr :: recode ()

df %>% 
  mutate(
    a = as.character(a),
    a_new = recode(a,
                   '1' = 'group1', 
                   '2' = 'group2', 
                   '3' = 'group1', 
                   '4' = 'group1', 
                   '5' = 'Other'))
...