Pertanyaan Kebingungan antara level faktor dan label faktor


Sepertinya ada perbedaan antara level dan label faktor dalam R. Hingga saat ini, saya selalu berpikir bahwa level adalah 'nyata' dari level faktor, dan label adalah nama yang digunakan untuk output (seperti tabel dan plot). Tentunya, ini tidak terjadi, seperti contoh berikut menunjukkan:

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 berpikir bahwa level ('a', 'b', 'c') entah bagaimana masih bisa diakses ketika scripting, tetapi ini tidak berfungsi:

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

Tetapi ini tidak:

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

Jadi, pertanyaan saya terdiri dari dua bagian:

  • Apa perbedaan antara level dan label?

  • Apakah mungkin untuk memiliki nama yang berbeda untuk level faktor untuk scripting dan output?

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


76
2018-05-03 12:37


asal


Jawaban:


Sangat singkat: level adalah input, label adalah output dalam factor() fungsi. Suatu faktor hanya memiliki a level atribut, yang diatur oleh labels argumen dalam factor() fungsi. Ini berbeda dari konsep label dalam paket statistik seperti SPSS, dan dapat membingungkan di awal.

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'))

mengatakan kepada R bahwa ada vektor df$f 

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

Fungsi faktor akan mencari nilai a, b dan c, mengkonversinya ke kelas faktor numerik, dan menambahkan nilai label ke level atribut faktor. Atribut ini digunakan untuk mengkonversi nilai-nilai numerik internal ke label yang benar. Tetapi seperti yang Anda lihat, tidak ada label atribut.

> 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"

99
2018-05-03 12:48



Saya menulis sebuah paket "lfactors" yang memungkinkan Anda untuk 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 lfactor mensyaratkan bahwa level harus numerik sehingga mereka tidak dapat disamakan dengan label.


7
2018-05-06 04:15