Путаница между уровнями факторов и метками факторов


кажется, есть разница между уровнями и метками фактора в 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

Итак, мой вопрос состоит из двух частей:

  • в чем разница между уровнями и метками?

  • можно ли иметь разные имена для уровней факторов для сценариев и выход?

фон: для более длинных сценариев сценарии с короткими уровнями факторов кажутся намного проще. Однако для отчетов и графиков этот короткий уровень факторов может быть недостаточным и должен быть заменить имена, а точнее.

2 77

2 ответа:

очень коротко: уровни-это вход, метки-это выход в .

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

Я написал пакет "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 требует, чтобы уровни были числовыми, чтобы их нельзя было спутать с метками.