Faktörleri kullanmalısınız. Evet, acı verici olabilirler, ancak benim teorim, neden acı olduklarının% 90'ının read.tableve varsayılan olarak read.csvargümandan kaynaklandığı stringsAsFactors = TRUE(ve çoğu kullanıcı bu inceliği kaçırıyor). Kullanışlı olduklarını söylüyorum çünkü lme4 gibi model yerleştirme paketleri, modelleri farklı şekilde sığdırmak ve kullanılacak kontrast türlerini belirlemek için faktörleri ve sıralı faktörleri kullanır. Ve grafik paketleri de bunları gruplamak için kullanır. ggplotve model uydurma işlevlerinin çoğu karakter vektörlerini faktörlere zorlar, dolayısıyla sonuç aynıdır. Ancak, kodunuzda uyarılarla karşılaşırsınız:
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)
Uyarı mesajı: Giriş model.matrix.default(mt, mf, contrasts):
değişken Speciesbirfactor
Bütünüyle aldatıcı bir şey var drop=TRUE. Vektörlerde bu, verilerde bulunmayan faktör düzeylerini kaldırmak için iyi çalışır. Örneğin:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
s[s == 'setosa', drop=FALSE]
Ancak , data.frames ile davranışı [.data.frame()farklıdır: bu e-postaya bakın veya ?"[.data.frame". Kullanılması drop=TRUEüzerine data.framehayal ediyorum gibi çalışmıyor s:
x <- subset(iris, Species == 'setosa', drop=TRUE)
x$Species
Neyse ki droplevels(), tek bir faktör için veya a'daki her faktör için kullanılmayan faktör seviyelerini düşürmek için faktörleri kolayca düşürebilirsiniz data.frame(R 2.12'den beri):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
x <- droplevels(x)
levels(x$Species)
ggplotEfsanelere girmekten seçtiğiniz seviyeleri nasıl koruyacağınız budur .
Dahili olarak factors, öznitelik seviyesi karakter vektörüne (bakınız attributes(iris$Species)ve class(attributes(iris$Species)$levels)) sahip, temiz olan tam sayılardır . Bir seviye adını değiştirmeniz gerekirse (ve karakter dizilerini kullanıyor olsaydınız), bu çok daha az verimli bir işlem olurdu . Ve özellikle ggplotefsaneler için seviye isimlerini çok değiştiriyorum . Karakter vektörleriyle faktörleri taklit ederseniz, yalnızca bir öğeyi değiştirme ve yanlışlıkla ayrı bir yeni seviye oluşturma riski vardır.