คุณควรใช้ปัจจัย ใช่พวกเขาอาจเป็นความเจ็บปวด แต่ทฤษฎีของฉันคือ 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.frame
s ไม่ได้ผลอย่างที่คุณคิด:
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
ตำนาน
ภายในfactor
s คือจำนวนเต็มที่มีเวกเตอร์อักขระระดับแอตทริบิวต์ (ดูattributes(iris$Species)
และclass(attributes(iris$Species)$levels)
) ซึ่งสะอาด ถ้าคุณต้องเปลี่ยนชื่อระดับ (และคุณกำลังใช้สตริงตัวอักษร) นี้จะเป็นมากการดำเนินงานที่มีประสิทธิภาพน้อยลง และฉันเปลี่ยนชื่อระดับggplot
บ่อยมากโดยเฉพาะอย่างยิ่งสำหรับตำนาน หากคุณปลอมปัจจัยด้วยเวกเตอร์อักขระมีความเสี่ยงที่คุณจะเปลี่ยนองค์ประกอบเพียงองค์ประกอบเดียวและสร้างระดับใหม่แยกโดยไม่ได้ตั้งใจ