การจัดการกับปัจจัยใน R เป็นงานที่ค่อนข้างแปลกฉันต้องยอมรับ ... ในขณะที่จัดลำดับระดับปัจจัยใหม่คุณจะไม่ได้จัดลำดับค่าตัวเลขที่อยู่ภายใต้ใหม่ นี่คือการสาธิตเล็กน้อย:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
ตอนนี้ถ้าคุณแปลงปัจจัยนี้เป็นตัวเลขคุณจะได้รับ:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
อย่างที่คุณเห็น ... โดยการเปลี่ยนระดับคุณจะเปลี่ยนระดับเท่านั้น (ใครจะบอกว่าเอ๊ะ?) ไม่ใช่ค่าตัวเลข! แต่เมื่อคุณใช้factor
ฟังก์ชันตามที่ @ โจนาธานช้างแนะนำสิ่งที่แตกต่างเกิดขึ้น: คุณเปลี่ยนค่าตัวเลขเอง
คุณจะได้รับข้อผิดพลาดอีกครั้ง 'สาเหตุที่คุณทำlevels
แล้วลอง relevel factor
มันด้วย อย่าทำ !!! อย่าใช้ไม่levels
งั้นคุณจะทำอะไรยุ่ง ๆ (เว้นแต่คุณจะรู้แน่ชัดว่ากำลังทำอะไรอยู่)
ข้อเสนอแนะของลิลหนึ่ง: หลีกเลี่ยงการตั้งชื่อวัตถุของคุณด้วยชื่อที่เหมือนกันกับวัตถุของ R ( df
คือฟังก์ชันความหนาแน่นสำหรับการแจกแจงแบบ F letters
ให้ตัวอักษรตัวพิมพ์เล็ก) ในกรณีนี้รหัสของคุณจะไม่ผิดพลาด แต่บางครั้งก็อาจเป็นได้ ... แต่อาจสร้างความสับสนและเราไม่ต้องการเช่นนั้นเราหรือไม่!? =)
ให้ใช้สิ่งนี้แทน (ฉันจะไปตั้งแต่ต้นอีกครั้ง):
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
โปรดทราบว่าคุณสามารถตั้งชื่อคุณdata.frame
ด้วยdf
และletters
แทนg
และผลลัพธ์ก็จะเป็นปกติ อันที่จริงรหัสนี้เหมือนกับรหัสที่คุณโพสต์มีเพียงชื่อเท่านั้นที่เปลี่ยนไป ส่วนนี้factor(dtf$letter, levels = letters[4:1])
จะไม่ทำให้เกิดข้อผิดพลาด แต่อาจทำให้สับสนได้!
อ่าน?factor
คู่มือให้ละเอียด! อะไรคือความแตกต่างระหว่างfactor(g, levels = letters[4:1])
และfactor(g, labels = letters[4:1])
? อะไรที่คล้ายกันในlevels(g) <- letters[4:1]
และg <- factor(g, labels = letters[4:1])
?
คุณสามารถใส่ไวยากรณ์ ggplot เพื่อให้เราช่วยคุณได้มากขึ้นในเรื่องนี้!
ไชโย !!!
แก้ไข:
ggplot2
ต้องเปลี่ยนทั้งระดับและค่าจริงหรือ? หืม ... ฉันจะขุดอันนี้ออก ...