Странный результат с мутацией в R - PullRequest
1 голос
/ 10 ноября 2019

Я хотел заменить «Неизвестные» значения для переменной во фрейме данных с помощью функции mutate, но я получил очень странный результат и не мог понять, почему.

Ниже приведены коды, которые я запускал. Я ожидал, что «-unnown-» заменит «TBD» в «пол2», в то время как другие вещи остаются такими же, как «пол»Однако в «пол2» «ЖЕНЩИНА» была изменена на «2», «МУЖЧИНА» была изменена на «3», а «ДРУГОЙ» неожиданно был изменен на «4»Кто-нибудь может указать на коренные причины? Большое спасибо!

> summary(Train$gender)
-unknown-    FEMALE      MALE     OTHER 
    94961     62023     53685       279 

> Train <- Train %>% mutate(gender2 = factor(ifelse(gender != "-unknown-", gender, "TBD")))

> summary(Train$gender2)
    2     3     4   TBD 
62023 53685   279 94961

1 Ответ

2 голосов
/ 10 ноября 2019

Проблема в том, что столбец уже является factor. Поэтому, когда мы используем ifelse, оно приводится к целочисленным значениям хранилища.

v1 <- factor(c('A', 'B', 'A', 'B', 'C'))
ifelse(v1 != 'A', v1, "TBD") 
#[1] "TBD" "2"   "TBD" "2"   "3"  

проверка целочисленных значений приведения

as.integer(v1)
#[1] 1 2 1 2 3

Вместо этого это может быть

ifelse(v1 != 'A', as.character(v1), "TBD")
#[1] "TBD" "B"   "TBD" "B"   "C"  

Итак, мы можем изменить столбец на character и затем оберните с factor

library(dplyr)
Train <- Train %>% 
            mutate(gender2 = factor(ifelse(gender != "-unknown-", 
                  as.character(gender), "TBD")))

Или вместо преобразования / реконвертации используйте fct_recode

library(forcats)
Train <- Train %>%
             mutate(gender2 = fct_recode(gender, "TBD" = "-unknown-"))

Используя воспроизводимый пример

iris1 <- iris %>%
            mutate(Species2 = fct_recode(Species, "TBD" = "setosa"))
summary(iris1$Species2)
#   TBD versicolor  virginica 
#    50         50         50 

Просто хотел упомянуть, что summary работает на столбце factor при получении счетчика частоты. Мы также можем использовать table, что является более общим, поскольку оно может работать на различных type s

table(iris1$Species2)
table(as.character(iris1$Species2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...