Путаница между уровнями факторов и метками факторов - PullRequest
91 голосов
/ 03 мая 2011

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

119 голосов
/ 03 мая 2011

Очень короткий: уровни - это вход, метки - это выход в функции 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"
12 голосов
/ 06 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...