Вам следует использовать коэффициенты. Да , они могут быть боль, но моя теория в том , что 90% того , почему они боль, потому что в read.tableи read.csvаргумент stringsAsFactors = TRUEпо умолчанию (и большинство пользователей пропустить эту тонкость). Я говорю, что они полезны, потому что пакеты подгонки моделей, такие как lme4, используют коэффициенты и упорядоченные коэффициенты для дифференциальной подгонки моделей и определения типа используемых контрастов. И пакеты построения графиков также используют их для группировки. ggplotи большинство функций подгонки моделей приводят символьные векторы к факторам, поэтому результат тот же. Однако в конечном итоге в вашем коде появляются предупреждения:
lm(Petal.Length ~ -1 + Species, data=iris)
iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)
Предупреждающее сообщение: In model.matrix.default(mt, mf, contrasts):
переменная Speciesпреобразована вfactor
Одна хитрость - это целый drop=TRUEбит. В векторах это хорошо работает для удаления уровней факторов, которых нет в данных. Например:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
s[s == 'setosa', drop=FALSE]
Однако с data.frames [.data.frame()ведет себя иначе: см. Это письмо или ?"[.data.frame". Использование drop=TRUEon data.frames не работает так, как вы думаете:
x <- subset(iris, Species == 'setosa', drop=TRUE)
x$Species
К счастью, вы можете легко отбросить факторы, droplevels()чтобы отбросить неиспользуемые уровни факторов для отдельного фактора или для каждого фактора в a data.frame(начиная с R 2.12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
x <- droplevels(x)
levels(x$Species)
Вот как уберечь выбранные вами уровни от попадания в ggplotлегенды.
Внутренне factors - это целые числа с вектором символов уровня атрибута (см. attributes(iris$Species)И class(attributes(iris$Species)$levels)), который является чистым. Если бы вам пришлось изменить имя уровня (и вы использовали символьные строки), это была бы гораздо менее эффективная операция. И я часто меняю названия уровней, особенно для ggplotлегенд. Если вы подделываете факторы с помощью символьных векторов, есть риск, что вы измените только один элемент и случайно создадите отдельный новый уровень.