Как работает R ifelse с символьными данными?

Кодовый фрагмент:

blarg = data.frame(a=c("aa", "bb", "dd"))
blarg$b = blarg$a
# blarg$b is now c("aa", "bb", "dd")
blarg$b = ifelse(blarg$a!="bb",blarg$a,"ZZZ")
# blarg$b is now c(1, "ZZZ", 3)
# I expected c("aa", "ZZZ", "dd")
# typeof(blarg$b) is "character"

Почему blarg $b c (1, "ZZZ", 3)? Откуда берутся цифры?

Ответ 1

+1 для использования data.frame с именем blarg.

Чтобы расширить то, что сказал Бен, факторы внутренне хранятся как целые числа, поэтому, когда вы делаете что-то вроде этого, R не обрабатывает его так, как вы ожидаете.

Взгляните на str(blarg) в шагах вашего кода выше.

Вы можете использовать stringsAsFactors=FALSE, как предложил Бен, или использовать коэффициент:

ifelse(blarg$a!='bb', levels(blarg$a), 'ZZZ')

Или еще лучше, если вы хотите заменить уровни blarg$a, которые 'bb', вы можете полностью исключить оператор ifelse:

levels(blarg$a)[levels(blarg$a)=='bb'] <- 'ZZZ'