Плутанина між рівнем фактора та міткою факторів


106

Здається, існує різниця між рівнями та мітками фактора в Р. Дотепер я завжди вважав, що рівні - це "справжня" назва рівнів факторів, а мітки - це імена, що використовуються для виведення (наприклад, таблиці та графіки) . Очевидно, що це не так, як показує наступний приклад:

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

Отже, моє запитання складається з двох частин:

  • Яка різниця між рівнями та мітками?

  • Чи можливо мати різні назви рівнів факторів для сценаріїв та результатів?

Передумови: Для більш довгих сценаріїв сценарій з короткими рівнями фактора здається набагато простішим. Однак для звітів та сюжетів цей короткий коефіцієнт може бути недостатнім, і його слід замінити точнішими назвами.

Відповіді:


131

Дуже коротко: рівні - це вхід, мітки - вихід у 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, 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"

1
Дякую за швидку відповідь! Я думаю, я зараз розумію призначення рівнів та міток. Можливо, якісь пропозиції щодо того, щоб зробити висновок по-людськи легше читабельним, не редагуючи назви таблиць та легенд сюжету вручну?
donodarazao

6
Я часто трансформував би рівні безпосередньо перед створенням / створенням міток, наприклад, зберігаючи рівні як "a", "b", "c" під час маніпулювання, а потім використовую рівні (f) <- paste ("Лікування", таппер (рівні ( f)), sep = "") [чи щось] під час побудови графіку. Або створіть паралельний коефіцієнт f_pretty, який ви носите з собою і використовуєте лише для виведення ...
Бен Болкер

Я думав і про обидва, але в обох методів є недоліки. Перший може стати стомлюючим при побудові величезної кількості графіків, а другий може стати стомлюючим, коли в сценаріях бере участь багато агрегації даних. Але, мабуть, немає ніякого способу цього уникнути, тому я піду з вашими пропозиціями. :)
donodarazao

@ 42- Я не впевнений, що ви маєте на увазі під "числовими значеннями". Якщо ви маєте на увазі внутрішні значення у факторі, то це саме те, що я сказав вище. Звідси згадування внутрішніх числових значень. Якщо ви вказуєте levelsаргумент, ви вводите значення у вхідних даних, які повинні відповідати labelsаргументу. R зберігає мітки (як атрибут levels, і там плутанина) і зберігає цілі коди всередині. Ці цілі коди не мають нічого спільного з вихідними значеннями, яким би типом вони не були. Я думаю, ти мене зрозумів неправильно.
Йоріс Майс

Вибачення. Те, що ви пишете, було і моїм розумінням, і тепер, коли я перечитую ваше запитання, я не бачу, де я думав, що ви сказали інакше. Я видалю свій коментар, оскільки він додає менше нічого.
IRTFM

17

Я написав пакет "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 вимагає, щоб рівні були числовими, щоб їх не можна переплутати з мітками.


3
це приємний пакет і дякую за публікацію про нього (і написання). Здається, такий функціонал, який повинен бути власним фактором R - приємно бачити пакет, який надає подібне зіставлення пари імен-значень із вбудованими чеками еквівалентності.
Сорен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.