У меня есть кадр данных с некоторыми числовыми переменными и некоторыми категориальными 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
Я просто хочу изменить порядок уровня, поэтому при графическом изображении, панели показывают в желаемом порядке - который может отличаться от алфавитного порядка по умолчанию.
Используйте аргумент уровней
из фактора
:
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
Итак, в лексиконе R вы хотите изменить только метки для данной факторной переменной (т.е. оставить данные, а также факторные уровни, без изменений).
df$letters = factor(df$letters, labels=c("d", "c", "b", "a"))
учитывая, что вы хотите изменить только сопоставление точек данных с метками, а не данные или схему фактора (как точки данных разбиваются на отдельные бины или значения фактора, может помочь знание того, как сопоставление было изначально установлено при первоначальном создании фактора.
правила просты:
Я должен признать, что работа с факторами в 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
действительно требует изменения и уровней, и значений? Хм ... Я откопаю это ...
еще немного, для записи
## 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 .