ความสับสนระหว่างระดับปัจจัยและป้ายกำกับปัจจัย


106

ดูเหมือนจะมีความแตกต่างระหว่างระดับและป้ายกำกับของปัจจัยใน R จนถึงตอนนี้ฉันคิดเสมอว่าระดับเป็นชื่อ 'จริง' ของระดับปัจจัยและป้ายกำกับเป็นชื่อที่ใช้สำหรับเอาต์พุต (เช่นตารางและพล็อต) . เห็นได้ชัดว่านี่ไม่ใช่กรณีดังตัวอย่างต่อไปนี้:

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

ฉันคิดว่าระดับ ('a', 'b', 'c') ยังสามารถเข้าถึงได้เมื่อเขียนสคริปต์ แต่สิ่งนี้ใช้ไม่ได้:

> df$f=='a'
[1] FALSE FALSE FALSE

แต่สิ่งนี้ทำ:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE

ดังนั้นคำถามของฉันประกอบด้วยสองส่วน:

  • ระดับและป้ายกำกับต่างกันอย่างไร

  • เป็นไปได้ไหมที่จะมีชื่อต่างกันสำหรับระดับแฟคเตอร์สำหรับการเขียนสคริปต์และเอาต์พุต

ความเป็นมา: สำหรับสคริปต์ที่ยาวขึ้นการเขียนสคริปต์ด้วยระดับปัจจัยสั้น ๆ ดูเหมือนจะง่ายกว่ามาก อย่างไรก็ตามสำหรับรายงานและพล็อตระดับปัจจัยสั้น ๆ นี้อาจไม่เพียงพอและควรแทนที่ด้วยชื่อตัวกำหนด

คำตอบ:


131

สั้นมาก: ระดับคืออินพุตป้ายกำกับคือเอาต์พุตในfactor()ฟังก์ชัน ปัจจัยมีเพียงlevelแอตทริบิวต์ซึ่งกำหนดโดยlabelsอาร์กิวเมนต์ในfactor()ฟังก์ชัน ซึ่งแตกต่างจากแนวคิดของฉลากในแพ็คเกจทางสถิติเช่น SPSS และอาจทำให้สับสนได้ในช่วงแรก

สิ่งที่คุณทำในบรรทัดของรหัสนี้

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))

กำลังบอกกับ R ว่ามีเวกเตอร์ df$f

  • ที่คุณต้องการแปลงเป็นตัวประกอบ
  • ซึ่งระดับต่างๆจะมีรหัสเป็น a, b และ c
  • และที่คุณต้องการให้ระดับถูกระบุว่าเป็น Treatment A เป็นต้น

ฟังก์ชันแฟกเตอร์จะค้นหาค่า a, b และ c แปลงเป็นคลาสตัวประกอบตัวเลขและเพิ่มค่าเลเบลให้กับlevelแอตทริบิวต์ของแฟคเตอร์ แอ็ตทริบิวต์นี้ใช้เพื่อแปลงค่าตัวเลขภายในเป็นเลเบลที่ถูกต้อง แต่อย่างที่คุณเห็นไม่มีlabelแอตทริบิวต์

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(df$f)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

> df$f <- factor(df$f, levels=c('a','b','c'),
+   labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"

1
ขอบคุณสำหรับคำตอบที่รวดเร็ว! ตอนนี้ฉันเดาว่าฉันเข้าใจจุดประสงค์ของระดับและป้ายกำกับแล้ว อาจมีข้อเสนอแนะในการทำให้เอาต์พุตสามารถอ่านได้ดีขึ้นโดยไม่ต้องแก้ไขชื่อตารางและพล็อตตำนานด้วยตนเอง?
donodarazao

6
ฉันมักจะเปลี่ยนระดับก่อนที่จะวางแผน / สร้างป้ายกำกับเช่นรักษาระดับเป็น "a", "b", "c" ในขณะที่จัดการจากนั้นใช้ระดับ (f) <- วาง ("การรักษา", ผู้แตะ (ระดับ ( f)), sep = "") [หรือบางสิ่ง] เมื่อวางแผน หรือสร้างปัจจัยคู่ขนาน f_pretty ที่คุณพกติดตัวและใช้สำหรับเอาต์พุตเท่านั้น ...
Ben Bolker

ฉันคิดเกี่ยวกับทั้งสอง แต่ทั้งสองวิธีมีข้อเสีย อย่างแรกอาจน่าเบื่อเมื่อต้องพล็อตกราฟจำนวนมากและอย่างที่สองอาจน่าเบื่อเมื่อการรวมข้อมูลจำนวนมากเกี่ยวข้องกับการเขียนสคริปต์ แต่เห็นได้ชัดว่าไม่มีทางหลีกเลี่ยงได้ง่ายๆดังนั้นฉันจะไปตามคำแนะนำของคุณ :)
donodarazao

@ 42- ฉันไม่แน่ใจว่า "ค่าตัวเลข" หมายถึงอะไร ถ้าคุณหมายถึงค่าภายในในตัวประกอบนั่นก็คือสิ่งที่ฉันกล่าวไว้ข้างต้น ดังนั้นการกล่าวถึงค่าตัวเลขภายใน หากคุณระบุlevelsอาร์กิวเมนต์คุณให้ค่าในอินพุตที่ต้องจับคู่กับlabelsอาร์กิวเมนต์ R เก็บป้ายกำกับ (เป็นแอตทริบิวต์levelsและมีความสับสน) และเก็บรหัสจำนวนเต็มไว้ภายใน รหัสจำนวนเต็มเหล่านี้ไม่มีส่วนเกี่ยวข้องกับค่าดั้งเดิมไม่ว่าจะเป็นประเภทใดก็ตาม ฉันคิดว่าคุณเข้าใจฉันผิด
Joris Meys

ขอโทษ. สิ่งที่คุณเขียนก็คือความเข้าใจของฉันเช่นกันและตอนนี้ฉันกำลังอ่านคำถามของคุณอีกครั้งฉันไม่เห็นว่าฉันคิดว่าคุณพูดต่างออกไปตรงไหน ฉันจะลบความคิดเห็นเพราะมันเพิ่มน้อยกว่าอะไรเลย
IRTFM

17

ฉันเขียนแพ็คเกจ "lfactors" ที่ให้คุณอ้างถึงระดับหรือป้ายกำกับ

# packages
install.packages("lfactors")
require(lfactors)

flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads"))
# Tails can now be referred to as, "Tails" or 0
# These two lines return the same result
flips == "Tails"
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE
flips == 0 
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

โปรดทราบว่า lfactor ต้องการให้ระดับเป็นตัวเลขเพื่อไม่ให้สับสนกับป้ายกำกับ


3
นี่เป็นแพ็คเกจที่ดีและขอบคุณสำหรับการโพสต์เกี่ยวกับมัน (และเขียนมัน) ดูเหมือนว่าฟังก์ชันการทำงานที่ควรจะเป็นปัจจัย R - ดีที่ได้เห็นแพ็คเกจที่ให้การจับคู่ชื่อ - ค่าประเภทนี้พร้อมการตรวจสอบความเท่าเทียมกันในตัว
Soren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.