Слід використовувати фактори. Так , вони можуть бути біль, але моя теорія в тому , що 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
перетворена на afactor
Одна хитра річ - це цілий 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
on 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
легенд. Якщо ви підробляєте фактори за допомогою векторів символів, існує ризик змінити лише один елемент і випадково створити окремий новий рівень.