Вам следует использовать коэффициенты. Да, они могут причинять боль, но моя теория состоит в том, что 90% причин, по которым они причиняют боль, - это потому, что в read.table
и read.csv
аргумент stringsAsFactors = TRUE
по умолчанию (и большинство пользователей упускают эту тонкость). Я говорю, что они полезны, потому что пакеты подгонки моделей, такие как lme4, используют коэффициенты и упорядоченные коэффициенты для дифференциальной подгонки моделей и определения типа используемых контрастов. И пакеты для построения графиков также используют их для группировки. ggplot
и большинство функций подгонки модели приводят символьные векторы к факторам, поэтому результат тот же. Однако в конечном итоге в вашем коде появляются предупреждения:
lm(Petal.Length ~ -1 + Species, data=iris)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
Предупреждающее сообщение: В model.matrix.default(mt, mf, contrasts)
:
переменная Species
преобразована в factor
Одна хитрость - это весь drop=TRUE
бит. В векторах это хорошо работает для удаления уровней факторов, которых нет в данных. Например:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
Однако с data.frame
s поведение [.data.frame()
другое: см. это письмо или ?"[.data.frame"
. Использование drop=TRUE
на data.frame
s работает не так, как вы думаете:
x <- subset(iris, Species == 'setosa', drop=TRUE) # susbetting with [ behaves the same way
x$Species
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
К счастью, вы можете легко отбросить факторы с помощью droplevels()
, чтобы удалить неиспользуемые уровни факторов для отдельного фактора или для каждого фактора в data.frame
(начиная с R 2.12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
Вот как уберечь выбранные вами уровни от попадания в ggplot
легенд.
Внутри factor
s являются целыми числами с вектором символов уровня атрибута (см. attributes(iris$Species)
и class(attributes(iris$Species)$levels)
), что является чистым. Если бы вам пришлось изменить имя уровня (и вы использовали символьные строки), это было бы гораздо менее эффективной операцией. И я часто меняю названия уровней, особенно для ggplot
легенд. Если вы подделываете факторы с помощью символьных векторов, есть риск, что вы измените только один элемент и случайно создадите отдельный новый уровень.
person
Vince
schedule
10.08.2010