Anda harus menggunakan faktor. Ya mereka bisa menyebalkan, tetapi teori saya adalah bahwa 90% mengapa mereka menyebalkan adalah karena dalam read.table
dan read.csv
, argumen stringsAsFactors = TRUE
secara default (dan sebagian besar pengguna melewatkan kehalusan ini). Saya katakan mereka berguna karena paket model fitting seperti faktor penggunaan lme4 dan faktor yang dipesan untuk menyesuaikan model secara berbeda dan menentukan jenis kontras yang akan digunakan. Dan paket grafik juga menggunakannya untuk mengelompokkan. ggplot
dan sebagian besar fungsi pemasangan model memaksa vektor karakter menjadi faktor, sehingga hasilnya sama. Namun, Anda berakhir dengan peringatan di kode Anda:
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
Pesan peringatan: Dalam model.matrix.default(mt, mf, contrasts)
:
variabel Species
diubah menjadifactor
Satu hal yang rumit adalah keseluruhannya drop=TRUE
. Dalam vektor, ini berfungsi dengan baik untuk menghilangkan tingkat faktor yang tidak ada dalam data. Sebagai contoh:
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
Namun , dengan data.frame
s, perilaku [.data.frame()
berbeda: lihat email ini atau ?"[.data.frame"
. Penggunaan drop=TRUE
pada data.frame
s tidak berfungsi seperti yang Anda bayangkan:
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
Untungnya Anda dapat menghilangkan faktor dengan mudah dengan droplevels()
menurunkan tingkat faktor yang tidak digunakan untuk satu faktor atau untuk setiap faktor dalam a data.frame
(sejak R 2.12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
Ini adalah cara menjaga level yang Anda pilih agar tidak menjadi ggplot
legenda.
Secara internal, factor
s adalah bilangan bulat dengan vektor karakter tingkat atribut (lihat attributes(iris$Species)
dan class(attributes(iris$Species)$levels)
), yang bersih. Jika Anda harus mengubah nama level (dan Anda menggunakan string karakter), ini akan menjadi operasi yang jauh kurang efisien. Dan saya banyak mengubah nama level, terutama untuk ggplot
legenda. Jika Anda memalsukan faktor dengan vektor karakter, ada risiko bahwa Anda hanya akan mengubah satu elemen, dan secara tidak sengaja membuat level baru yang terpisah.