Mylenie poziomów czynników i etykiet czynników

Wydaje się, że istnieje różnica między poziomami a etykietami czynnika w R. Do tej pory zawsze uważałem, że poziomy są "prawdziwą" nazwą poziomów czynników, a etykiety są nazwami używanymi do wyjścia (takimi jak tabele i wykresy). Oczywiście tak nie jest, jak pokazuje poniższy przykład:

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"

Myślałem, że poziomy ('a','b','c') mogą być nadal dostępne podczas skryptowania, ale to nie działa:

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

Ale tak jest:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE
Więc moje pytanie składa się z dwóch części:
  • Jaka jest różnica między poziomami a etykietami?

  • Czy jest możliwe, aby mieć różne nazwy poziomów czynników dla skryptów i wyjście?

Tło: w przypadku dłuższych skryptów tworzenie skryptów z krótkimi poziomami czynników wydaje się znacznie łatwiejsze. Jednakże w przypadku sprawozdań i wykresów te krótkie poziomy współczynników mogą nie być odpowiednie i należy je zastąpić nazwami preciserów.

Author: divibisan, 2011-05-03

2 answers

Bardzo krótkie : poziomy są wejściem, etykiety są wyjściem w funkcji factor(). Czynnik ma tylko atrybut level, który jest ustawiany przez argument labels w funkcji factor(). Różni się to od koncepcji etykiet w pakietach statystycznych, takich jak SPSS, i może być mylące na początku.

Co robisz w tej linijce kodu

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

Mówi do R, że istnieje wektor df$f

  • które chcesz przekształcić w czynnik,
  • w którym różne poziomy są kodowane jako a, b i c
  • i dla których chcesz, aby poziomy były oznaczone jako leczenie A itp.

Funkcja factor Wyszukuje wartości a, b i c, konwertuje je na klasy współczynników numerycznych i dodaje wartości etykiety do atrybutu level czynnika. Ten atrybut jest używany do konwersji wewnętrznych wartości liczbowych na właściwe etykiety. Ale jak widzisz, nie ma label atrybutu.

> 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"
 101
Author: Joris Meys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-03 12:48:48

Napisałem pakiet "lfactors", który pozwala odnosić się do poziomów lub etykiet.

# 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

Zauważ, że lfactor wymaga, aby poziomy były numeryczne, aby nie mogły być mylone z etykietami.

 8
Author: pdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 21:30:30