Faktörleri kullanmalısınız. Evet, acı verici olabilirler, ancak benim teorim, neden acı olduklarının% 90'ının read.table
ve varsayılan olarak read.csv
argü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. ggplot
ve 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 Species
birfactor
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.frame
s ile davranışı [.data.frame()
farklıdır: bu e-postaya bakın veya ?"[.data.frame"
. Kullanılması drop=TRUE
üzerine data.frame
hayal 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)
ggplot
Efsanelere girmekten seçtiğiniz seviyeleri nasıl koruyacağınız budur .
Dahili olarak factor
s, ö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 ggplot
efsaneler 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.