Вам следует использовать коэффициенты. Да , они могут быть боль, но моя теория в том , что 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.frame
s [.data.frame()
ведет себя иначе: см. Это письмо или ?"[.data.frame"
. Использование drop=TRUE
on data.frame
s не работает так, как вы думаете:
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
легенды.
Внутренне factor
s - это целые числа с вектором символов уровня атрибута (см. attributes(iris$Species)
И class(attributes(iris$Species)$levels)
), который является чистым. Если бы вам пришлось изменить имя уровня (и вы использовали символьные строки), это была бы гораздо менее эффективная операция. И я часто меняю названия уровней, особенно для ggplot
легенд. Если вы подделываете факторы с помощью символьных векторов, есть риск, что вы измените только один элемент и случайно создадите отдельный новый уровень.