Уровни переупорядочивания фактора, не изменяя порядок значений

У меня есть кадр данных с некоторыми числовыми переменными и некоторыми категориальными factor переменные. Порядок уровней для тех факторов не является способом, которым я хочу, чтобы они были.

numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
#   numbers letters
# 1       1       a
# 2       2       b
# 3       3       c
# 4       4       d

Если я изменяю порядок уровней, буквы больше не с их соответствующими числами (мои данные являются общей ерундой с этого момента).

levels(df$letters) <- c("d", "c", "b", "a")
df
#   numbers letters
# 1       1       d
# 2       2       c
# 3       3       b
# 4       4       a

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

114
задан Henrik 20 March 2016 в 11:38
поделиться

4 ответа

Используйте аргумент уровней из фактора :

df <- data.frame(f = 1:4, g = letters[1:4])
df
#   f g
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d

levels(df$g)
# [1] "a" "b" "c" "d"

df$g <- factor(df$g, levels = letters[4:1])
# levels(df$g)
# [1] "d" "c" "b" "a"

df
#   f g
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
113
ответ дан 24 November 2019 в 02:36
поделиться

Итак, в лексиконе R вы хотите изменить только метки для данной факторной переменной (т.е. оставить данные, а также факторные уровни, без изменений).

df$letters = factor(df$letters, labels=c("d", "c", "b", "a"))

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

правила просты:

  • метки сопоставляются с уровнями по значению индекса (т.е. значению на уровне levels[2] присваивается метка label[2]);
  • уровни фактора можно задать явно, передав их через параметр levels; или
  • если для аргумента levels не указано значение, то используется значение по умолчанию используется значение по умолчанию, которое является результатом вызова unique на векторе данных переданном (для аргумента data);
  • метки могут быть заданы явно через аргумент labels; или
  • если для аргумента labels не задано значение, то используется значение по умолчанию. которое является просто вектором levels
9
ответ дан 24 November 2019 в 02:36
поделиться

Я должен признать, что работа с факторами в R - довольно своеобразная работа ... При изменении порядка уровней факторов вы не меняете порядок лежащие в основе числовые значения. Вот небольшая демонстрация:

> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
  numbers letters
1       1       a
2       2       b
3       3       c
4       4       d
> sapply(dtf, class)
  numbers   letters 
"integer"  "factor" 

Теперь, если вы переведете этот коэффициент в числовой, вы получите:

# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
  numbers letters
1       1       d
2       2       c
3       3       b
4       4       a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4

Как видите ... изменяя уровни, вы меняете только уровни (кто бы сказал, а?), не числовые значения! Но когда вы используете функцию factor , как предложил @Jonathan Chang, происходит нечто иное: вы меняете сами числовые значения.

Вы снова получаете ошибку, потому что вы делаете уровней , а затем пытаетесь повторно выровнять его с коэффициентом . Не делай этого !!! Не не используйте уровней , иначе вы все испортите (если вы точно не знаете, что делаете).

Одно небольшое предложение: избегайте называть свои объекты одинаковыми именами с объектами R ( df - функция плотности для распределения F, букв дает строчные буквы алфавита). В этом конкретном случае ваш код не будет ошибочным, но иногда это может быть ... но это может создать путаницу, а мы этого не хотим, не так ли?!? =)

Вместо этого используйте что-то вроде этого (я снова начну с самого начала):

> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
  f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
  f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1

Обратите внимание, что вы также можете назвать себя data.frame с помощью ] df и букв вместо g , и результат будет в порядке. Собственно, этот код идентичен тому, который вы опубликовали, только названия изменены.Эта часть фактора (dtf $ letter, levels = letter [4: 1]) не выдаст ошибку, но может сбивать с толку!

Внимательно прочтите руководство ? Factor ! В чем разница между коэффициентом (г, уровни = буквы [4: 1]) и коэффициентом (г, метки = буквы [4: 1]) ? Что похожего в уровнях (g) <- буквы [4: 1] и g <- factor (g, labels = letter [4: 1]) ?

Вы можете поместите синтаксис ggplot, чтобы мы могли помочь вам в этом подробнее!

Ура !!!

Изменить:

ggplot2 действительно требует изменения и уровней, и значений? Хм ... Я откопаю это ...

6
ответ дан 24 November 2019 в 02:36
поделиться

еще немного, для записи

## reorder is a base function
df$letters <- reorder(df$letters, new.order=letters[4:1])

library(gdata)
df$letters <- reorder.factor(df$letters, letters[4:1])

Вы также можете найти полезные Relevel и comb_factor .

20
ответ дан 24 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: