новое назначение уровня фактора ведет себя странно в зависимости от положения новой строки фактора в списке - PullRequest
0 голосов
/ 19 декабря 2018

Я знаю, что добавить новые уровни к объекту класса factor довольно просто.Однако, когда я помещаю добавляемый уровень фактора в первую позицию в списке, фактические значения в объекте (векторе) меняются.

Вот что я имею в виду:

test <- factor(c("a", "a", "a", "b", "c", "a", "c", "b"))

test
#[1] a a a b c a c b
#Levels: a b c

levels(test)
#[1] "a" "b" "c"

## Works OK
levels(test) <- c(levels(test), "d")
#[1] a a a b c a c b
#Levels: a b c d

levels(test) <- c("d", levels(test))

## The values have changed
test
#[1] d d d a b d b a
#Levels: d a b c

Мне просто любопытно, почему положение нового уровня фактора в списке влияет на уровни фактора, а сам фактор изменяется.

1 Ответ

0 голосов
/ 19 декабря 2018

Факторы уровней фактора - это строки символов, связанные с базовой целочисленной переменной (перечисление ).

Если мы рассмотрим базовую структуру этой переменной:

test <- factor(c("a", "a", "a", "b", "c", "a", "c", "b"))

, то увидим:

str(test)
## Factor w/ 3 levels "a","b","c": 1 1 1 2 3 1 3 2

Что levels() делает, это назначает коды целочисленным значениям в порядке : levels(test) <- c("d","a","b","c") делает соответствие 1 <-> «d», 2 <-> «a», 3 <-> «b», 4 <-> «c».Таким образом, значения, имеющие базовое значение 1 (с первого по третий и шестой элементы вектора), теперь имеют ассоциированную метку "d".

Более безопасный способ добавления нового уровня:

test <- factor(test,levels=c("d","a","b","c"))
test
## [1] a a a b c a c b
## Levels: d a b c
str(test)
## Factor w/ 4 levels "d","a","b","c": 2 2 2 3 4 2 4 3

Это изменяет порядок уровней (что имеет значение для построения и параметризации статистических моделей), но использует символьные значения при назначении целочисленных значений ...

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