คุณควรใช้ปัจจัย ใช่พวกเขาอาจเป็นความเจ็บปวด แต่ทฤษฎีของฉันคือ 90% ของสาเหตุที่พวกเขาเจ็บปวดนั้นเป็นเพราะในread.tableและโดยค่าเริ่มต้นread.csvการโต้แย้งstringsAsFactors = TRUE(และผู้ใช้ส่วนใหญ่พลาดความละเอียดอ่อนนี้) ฉันบอกว่ามันมีประโยชน์เพราะแพ็คเกจฟิตติ้งโมเดลเช่น lme4 ใช้แฟกเตอร์และสั่งซื้อแฟกเตอร์ให้เข้ากับโมเดลที่แตกต่างกันและกำหนดประเภทคอนทราสต์ที่จะใช้ และแพ็คเกจการสร้างกราฟยังใช้เพื่อจัดกลุ่มตาม ggplotและฟังก์ชันการปรับโมเดลส่วนใหญ่บังคับให้เวกเตอร์อักขระเข้ากับปัจจัยดังนั้นผลลัพธ์จึงเหมือนกัน อย่างไรก็ตามคุณจะได้รับคำเตือนในรหัสของคุณ:
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)
ข้อความเตือน: ในmodel.matrix.default(mt, mf, contrasts):
ตัวแปรSpeciesแปลงเป็นfactor
สิ่งที่ยุ่งยากอย่างหนึ่งคือdrop=TRUEบิตทั้งหมด ในเวกเตอร์สิ่งนี้ใช้ได้ดีในการลบระดับของปัจจัยที่ไม่มีอยู่ในข้อมูล ตัวอย่างเช่น:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
s[s == 'setosa', drop=FALSE]
อย่างไรก็ตามด้วยdata.frameพฤติกรรมที่[.data.frame()แตกต่างกัน: ดูอีเมลนี้หรือ?"[.data.frame". การใช้งานdrop=TRUEบนdata.frames ไม่ได้ผลอย่างที่คุณคิด:
x <- subset(iris, Species == 'setosa', drop=TRUE)
x$Species
โชคดีที่คุณสามารถดร็อปปัจจัยได้อย่างง่ายดายด้วยdroplevels()การลดระดับปัจจัยที่ไม่ได้ใช้สำหรับแต่ละปัจจัยหรือสำหรับทุกปัจจัยใน a data.frame(ตั้งแต่ R 2.12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
x <- droplevels(x)
levels(x$Species)
นี่คือวิธีการรักษาระดับที่คุณเลือกไม่ให้เข้าร่วมในggplotตำนาน
ภายในfactors คือจำนวนเต็มที่มีเวกเตอร์อักขระระดับแอตทริบิวต์ (ดูattributes(iris$Species)และclass(attributes(iris$Species)$levels)) ซึ่งสะอาด ถ้าคุณต้องเปลี่ยนชื่อระดับ (และคุณกำลังใช้สตริงตัวอักษร) นี้จะเป็นมากการดำเนินงานที่มีประสิทธิภาพน้อยลง และฉันเปลี่ยนชื่อระดับggplotบ่อยมากโดยเฉพาะอย่างยิ่งสำหรับตำนาน หากคุณปลอมปัจจัยด้วยเวกเตอร์อักขระมีความเสี่ยงที่คุณจะเปลี่ยนองค์ประกอบเพียงองค์ประกอบเดียวและสร้างระดับใหม่แยกโดยไม่ได้ตั้งใจ