Путаница между уровнями факторов и метками факторов
Кажется, существует различие между уровнями и метками фактора 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
Итак, мой вопрос состоит из двух частей:
Справочная информация. Для более длинных скриптов сценарии с короткими коэффициентами, похоже, намного проще. Однако для отчетов и графиков эти короткие уровни факторов могут быть недостаточными и должны быть заменены именами префиксов.
Ответы
Ответ 1
Очень короткий: уровни - это вход, метки - вывод в функции factor()
. Фактор имеет только атрибут level
, который устанавливается аргументом labels
в функции factor()
. Это отличается от концепции меток в статистических пакетах, таких как SPSS, и может быть запутанным в начале.
Что вы делаете в этой строке кода
df$f <- factor(df$f, levels=c('a','b','c'),
labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
сообщает R, что существует вектор df$f
- который вы хотите преобразовать в коэффициент,
- в котором разные уровни кодируются как a, b и c
- и для которых вы хотите, чтобы уровни были помечены как "Лечение A" и т.д.
Факторная функция будет искать значения a, b и c, преобразовывать их в классы числовых коэффициентов и добавлять значения меток в атрибут level
фактора. Этот атрибут используется для преобразования внутренних числовых значений в правильные метки. Но, как вы видите, нет атрибута label
.
> 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"
Ответ 2
Я написал пакет "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 требует, чтобы уровни были числовыми, чтобы их не путать с метками.