Kebingungan antara level faktor dan label faktor

106

Tampaknya ada perbedaan antara level dan label sebuah faktor di R. Hingga saat ini, saya selalu berpikir bahwa level adalah nama 'sebenarnya' dari level faktor, dan label adalah nama yang digunakan untuk output (seperti tabel dan plot) . Jelas, ini bukan masalahnya, seperti yang ditunjukkan contoh berikut:

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"

Saya pikir level ('a', 'b', 'c') masih bisa diakses saat membuat skrip, tetapi ini tidak berhasil:

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

Tapi ini memang:

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

Jadi, pertanyaan saya terdiri dari dua bagian:

  • Apa perbedaan antara level dan label?

  • Apakah mungkin memiliki nama yang berbeda untuk tingkat faktor untuk skrip dan keluaran?

Latar belakang: Untuk skrip yang lebih panjang, skrip dengan level faktor pendek tampaknya jauh lebih mudah. Namun, untuk laporan dan plot, tingkat faktor yang pendek ini mungkin tidak memadai dan harus diganti dengan nama pendahulu.

donodarazao
sumber

Jawaban:

131

Sangat singkat: level adalah input, label adalah output dalam factor()fungsi. Faktor hanya memiliki levelatribut, yang ditetapkan oleh labelsargumen dalam factor()fungsi. Ini berbeda dengan konsep label dalam paket statistik seperti SPSS, dan dapat membingungkan pada awalnya.

Apa yang Anda lakukan di baris kode ini

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

memberi tahu R bahwa ada vektor df$f

  • yang ingin Anda ubah menjadi faktor,
  • di mana tingkat-tingkat yang berbeda dikodekan sebagai a, b, dan c
  • dan yang Anda ingin levelnya diberi label sebagai Perlakuan A dll.

Fungsi faktor akan mencari nilai a, b dan c, mengubahnya menjadi kelas faktor numerik, dan menambahkan nilai label ke levelatribut faktor tersebut. Atribut ini digunakan untuk mengubah nilai numerik internal menjadi label yang benar. Tapi seperti yang Anda lihat, tidak ada labelatribut.

> 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"
Joris Meys
sumber
1
Terima kasih atas jawaban cepatnya! Saya rasa saya mengerti tujuan level dan label sekarang. Mungkin ada saran untuk membuat keluaran lebih mudah dibaca tanpa mengedit nama tabel dan legenda plot secara manual?
donodarazao
6
Saya sering mengubah level tepat sebelum memplot / membuat label, misalnya menjaga level sebagai "a", "b", "c" sambil memanipulasi, kemudian menggunakan level (f) <- paste ("Treatment", toupper (level ( f)), sep = "") [atau sesuatu] saat membuat plot. Atau buat faktor paralel f_pretty yang Anda bawa dan gunakan hanya untuk keluaran ...
Ben Bolker
Saya memikirkan keduanya, tetapi kedua metode memiliki kelemahan. Yang pertama mungkin membosankan saat memplot grafik dalam jumlah besar, dan yang kedua mungkin membosankan ketika banyak agregasi data terlibat dalam pembuatan skrip. Tetapi ternyata tidak ada cara untuk menghindarinya dengan mudah, jadi saya akan mengikuti saran Anda. :)
donodarazao
@ 42- Saya tidak yakin apa yang Anda maksud dengan "nilai numerik". Jika yang Anda maksud adalah nilai internal dalam faktor maka itulah yang saya katakan di atas. Karenanya penyebutan nilai numerik internal . Jika Anda menentukan levelsargumen, Anda memberikan nilai dalam input yang harus cocok dengan labelsargumen. R menyimpan label (sebagai atribut levels, dan ada kebingungan) dan menyimpan kode integer secara internal. Kode integer ini tidak ada hubungannya dengan nilai asli, apapun jenisnya. Saya pikir Anda salah paham.
Joris Meys
Permintaan maaf. Apa yang Anda tulis adalah pemahaman saya juga, dan sekarang saya membaca ulang pertanyaan Anda, saya tidak dapat melihat di mana saya pikir Anda mengatakan secara berbeda. Saya akan menghapus komentar saya karena menambahkan kurang dari tidak sama sekali.
IRTFM
17

Saya menulis paket "lfactors" yang memungkinkan Anda merujuk ke level atau label.

# 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

Perhatikan bahwa sebuah lfactor mensyaratkan bahwa level-level tersebut berupa angka sehingga tidak dapat disalahartikan dengan label.

pdb
sumber
3
ini adalah paket yang bagus dan terima kasih telah mempostingnya (dan menulisnya). Tampaknya jenis fungsionalitas yang seharusnya asli dari faktor R - senang melihat paket yang menyediakan pemetaan pasangan nama-nilai semacam ini dengan pemeriksaan kesetaraan bawaan.
Soren