आपको कारकों का उपयोग करना चाहिए। हाँ, वे एक दर्द हो सकते हैं, लेकिन मेरा सिद्धांत यह है कि 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, का व्यवहार [.data.frame()अलग है: इस ईमेल को देखें या ?"[.data.frame"। का उपयोग drop=TRUEपर data.frameरों काम नहीं करता है के रूप में आप कल्पना चाहते हैं:
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(2. 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एस एक विशेषता स्तर चरित्र वेक्टर (देखें attributes(iris$Species)और class(attributes(iris$Species)$levels)) के साथ पूर्णांक हैं , जो साफ है। यदि आपको एक स्तर नाम बदलना था (और आप वर्ण स्ट्रिंग का उपयोग कर रहे थे), तो यह बहुत कम कुशल संचालन होगा। और मैं स्तर के नाम को बहुत बदल देता हूं, खासकर ggplotकिंवदंतियों के लिए। यदि आप चरित्र वैक्टर के साथ नकली कारक हैं, तो जोखिम है कि आप सिर्फ एक तत्व को बदल देंगे, और गलती से एक नया स्तर बना सकते हैं।