Почему мои уровни факторов превращаются в числа с помощью dplyr :: mutate ()?

Я пытаюсь перекодировать некоторые уровни факторов с помощью dplyr :: mutate (), чтобы все уровни факторов «MOT» и «CHI» оставались такими, какие они есть, а все остальные превратились в «OTH».

Мои данные выглядят так:

subj | speaker | word

1        MOT     apple
1        CHI     baby
1        SI1     baby
2        CHI     dog
2        CHI     cat
2        FAT     cat

И я хочу, чтобы это выглядело так:

subj | speaker | word

1        MOT     apple
1        CHI     baby
1        OTH     baby
2        CHI     dog
2        CHI     cat
2        OTH     cat

Мой код выглядит так:

new.df <- data %>%
  dplyr::select(subj, speaker) %>%
        mutate(speaker = factor(speaker),
         speaker = ifelse(speaker %in% c("CHI", "MOT"), speaker, "OTH")) 

Однако, когда я запускаю этот скрипт, некоторые уровни преобразуются в «OTH», но все остальные меняются на числа. Это происходит независимо от того, включаю ли я команду фактора (динамика):

subj | speaker | word

1        175     apple
1        86      baby
1        OTH     baby
2        86      dog
2        86      cat
2        OTH     cat

Он меняет коэффициенты на "OTH", но проблема в ИСТИННОМ элементе моего кода ifelse.

Большое спасибо!


person Catherine Laing    schedule 23.06.2017    source источник
comment
Возможно, вам понадобится as.character (динамик) в качестве второго аргумента ifelse. Факторы R - это целые числа. Если бы говорящий был персонажем, то вы стреляли бы себе в ногу с вызовом фактора, поступающим перед операцией ifelse. Это может иметь смысл позже.   -  person IRTFM    schedule 23.06.2017
comment
Это сработало! Огромное спасибо! Но я не понимаю, почему это могло произойти - когда я опускаю команду as.factor (), R сообщает мне, что динамик уже является вектором символов.   -  person Catherine Laing    schedule 23.06.2017
comment
Факторы в R являются целыми числами - целыми числами, которым можно присвоить имя при создании фактора.   -  person Ryan Morton    schedule 23.06.2017


Ответы (3)


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

new.df <- df %>%
select(subj, speaker) %>%
    mutate(speaker = ifelse(speaker %in% c("CHI", "MOT"), levels(speaker)
[speaker], "OTH")) 

Итак, чтобы зафиксировать фактическое значение, мы можем использовать уровни (динамик) [динамик]

person Shivkumar Kawtikwar    schedule 25.06.2017

Почему я не совсем уверен, но если вы читаете меню справки для factor:? Factor, в нем упоминается первое преобразование в as.character.

new.df <- data %>%
dplyr::select(subj, speaker) %>%
    mutate(speaker = factor(speaker),
     speaker = ifelse(speaker %in% c("CHI", "MOT"), as.character(speaker), "OTH")) 
person Alex Dometrius    schedule 23.06.2017

Чтобы изменить уровни факторов, а не значения в столбце символов, вам необходимо работать непосредственно с уровнями факторов. Вы можете сделать это в базовом R, работая с функцией levels или с функцией fct_other в пакете forcats от RStudio. В обоих методах speaker в new.df является фактором с требуемыми уровнями.

Эти методы показаны ниже:

data <- data.frame(subj=c(1,1,1,2,2,2), speaker=c("MOT","CHI","SI1","CHI","CHI","FAT"), word=c("apply","baby","baby","dog","cat", "cat"))
#
# To reset selected levels in base R
#
  new.df <- data
  new.df$speaker <- factor(new.df$speaker)
  levels(new.df$speaker)[!levels(new.df$speaker) %in% c("CHI", "MOT")] <- "OTH"
#
# To reset using forcats package from the RStudio suite
#
  library(dplyr)
  library(forcats)
  new.df <- data %>% mutate(speaker = fct_other(speaker, keep=c("CHI","MOT"),
                                                other_level = "OTH"))
  #
  # Note that speaker in new.df is a factor with the new levels
  #
   str(new.df)
person WaltS    schedule 25.06.2017