Pertanyaan Mengapa terminologi label dan level dalam faktor sangat aneh?


Contoh fungsi non-settable labels. Anda hanya dapat mengatur label faktor ketika dibuat dengan fungsi faktor. Tidak ada labels<- fungsi. Bukan itu 'label' dan 'tingkat' dalam faktor masuk akal ....

>  fac <- factor(1:3, labels=c("one", "two", "three"))
> fac
[1] one   two   three
Levels: one two three
> labels(fac)
[1] "1" "2" "3"

Oke, saya minta label, yang mungkin dianggap seperti yang ditetapkan oleh panggilan faktor, tetapi saya mendapatkan sesuatu yang cukup ... apa kata itu, unintuitive?

> levels(fac)
[1] "one"   "two"   "three"

Jadi tampaknya label pengaturan benar-benar mengatur level.

>  fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one"   "two"   "three"

OK itu seperti yang diharapkan. Jadi apa label ketika satu set level?

>  fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") )
> labels(fac)
[1] "1" "2" "3"
> levels(fac)
[1] "x" "y" "z"

Merasa aneh, jika kau bertanya padaku. Tampaknya argumen 'label' untuk faktor mengalahkan setiap argumen 'tingkat' untuk spesifikasi level. Kenapa harus begini? Sepertinya terminologi yang membingungkan. Dan mengapa demikian labels() mengembalikan apa yang saya bayangkan akan diambil dengan as.character (as.numeric (fac))?

(Ini adalah komentar tangensial [diberi label seperti itu] dalam jawaban sebelumnya tentang fungsi tugas yang saya diminta untuk pindah ke sebuah pertanyaan. Jadi, inilah kesempatan Anda untuk mencerahkan saya.)


32
2017-08-19 23:27


asal


Jawaban:


Saya pikir cara berpikir tentang perbedaan antara labels dan levels (mengabaikan labels() fungsi yang dijelaskan Tommy dalam jawabannya) adalah itu levels dimaksudkan untuk memberi tahu R nilai mana yang dicari dalam input (x) dan urutan apa yang digunakan dalam level yang dihasilkan factor objek, dan labels adalah untuk mengubah nilai-nilai dari level setelah input telah dikodekan sebagai faktor ... seperti yang disarankan oleh jawaban Tommy, tidak ada bagian dari factor objek dikembalikan oleh factor() itu yang dipanggil labels ... hanya levelnya, yang telah disesuaikan oleh labels argumen ... (jelas seperti lumpur).

Sebagai contoh:

> f <- factor(x=c("a","b","c"),levels=c("c","d","e"))
> f
[1] <NA> <NA> c  
Levels: c d e
> str(f)
Factor w/ 3 levels "c","d","e": NA NA 1

Karena dua elemen pertama dari x tidak ditemukan di levels, dua elemen pertama dari f adalah NA. Karena "d" dan "e" termasuk dalam levels, mereka muncul di tingkat f meskipun mereka tidak terjadi x.

Sekarang dengan labels:

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("C","D","E"))
> f
[1] <NA> <NA> C   
Levels: C D E

Setelah R mengetahui apa yang seharusnya ada dalam faktor, itu akan mengkode ulang level. Seseorang tentu saja dapat menggunakan ini untuk melakukan hal-hal yang menggelitik otak seperti:

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("a","b","c"))
> f
[1] <NA> <NA> a   
Levels: a b c

Cara lain untuk memikirkannya levels Apakah itu factor(x,levels=L1,labels=L2) setara dengan

f <- factor(x,levels=L1)
levels(f) <- L2

Saya pikir versi yang tepat dari contoh ini mungkin bagus untuk Pat Burns R inferno - Ada banyak faktor teka-teki di bagian 8.2, tapi tidak satu ini ...


28
2017-08-19 23:46



Itu labels fungsi terdengar sangat cocok untuk mendapatkan label suatu faktor.

...tetapi labels fungsi tidak ada hubungannya dengan faktor! Ini digunakan sebagai cara umum untuk mendapatkan sesuatu untuk "label" objek. Untuk vektor atom, ini adalah nama. Tetapi jika tidak ada nama, maka labels fungsi mengembalikan indeks elemen yang dipaksakan ke string - sesuatu seperti as.character(seq_along(x)).

... Jadi itulah yang Anda lihat ketika Anda mencoba memberi label pada suatu faktor. Faktornya adalah vektor integer tanpa nama, tetapi dengan levelsatribut.

Faktor tidak memiliki label. Hanya memiliki level. Itu labels argumen untuk factor hanya cara untuk dapat memberikan serangkaian string tetapi menghasilkan rangkaian string lain seperti level ... Tetapi untuk membingungkan hal - hal lebih jauh, dput fungsi mencetak levels atribut sebagai .Label! Saya pikir itu adalah hal warisan ...

# Translate lower case letters to upper case.
f <- factor(letters[2:4], letters[1:3], LETTERS[1:3])
dput(f)
#structure(c(2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor")
attributes(f)
#$levels
#[1] "A" "B" "C"
#
#$class
#[1] "factor"

Namun, sejak itu labels adalah fungsi generik, mungkin akan menjadi ide yang baik untuk didefinisikan labels.factor sebagai berikut (saat ini tidak ada). Mungkin sesuatu yang perlu dipertimbangkan oleh R core?

labels.factor <- function(x, ...) as.character(x)

15
2017-08-19 23:33