У меня есть фрейм данных с некоторыми числовыми переменными и некоторыми категориальными 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
Я просто хочу изменить порядок уровней , поэтому при построении столбцы отображаются в желаемом порядке, который может отличаться от алфавитного порядка по умолчанию.
Ответы:
Используйте
levels
аргументfactor
:источник
еще немного, для протокола
Вы также можете найти полезные Relevel и comb_factor .
источник
reorder(df$letters, seq(4,1))
Поскольку этот вопрос был активен в последний раз, Хэдли выпустил свой новый
forcats
пакет для управления факторами, и я нахожу его чрезвычайно полезным. Примеры из фрейма данных OP:Чтобы изменить уровни:
Чтобы добавить больше уровней:
И еще много полезных
fct_xxx()
функций.источник
df %>% mutate(letters = fct_rev(letters))
.поэтому в лексиконе R вы хотите изменить только метки для заданной факторной переменной (т. е. оставить данные, а также уровни факторов без изменений).
учитывая, что вы хотите изменить только сопоставление точек данных и меток, а не данные или факторную схему (как точки данных группируются в отдельные ячейки или значения факторов, это может помочь узнать, как сопоставление изначально установлено при первоначальном создании фактор.
правила просты:
источник
Я должен признать, что иметь дело с факторами в R - довольно своеобразная работа ... Меняя порядок уровней факторов, вы не меняете порядок базовых числовых значений. Вот небольшая демонстрация:
Теперь, если вы переведете этот коэффициент в числовой, вы получите:
Как видите ... изменяя уровни, вы меняете только уровни (кто бы сказал, а?), А не числовые значения! Но когда вы используете
factor
функцию, как предложил @Jonathan Chang, происходит нечто иное: вы меняете сами числовые значения.Вы снова получаете ошибку, потому что вы делаете это,
levels
а затем пытаетесь исправить ее с помощьюfactor
. Не делай этого !!! Вы не используете ,levels
или вы будете натворить (если вы точно не знаете , что вы делаете).Одно небольшое предложение: избегайте называть свои объекты такими же именами, как объекты R (
df
это функция плотности для распределения F,letters
дает буквы алфавита в нижнем регистре). В этом конкретном случае ваш код не будет ошибочным, но иногда это может быть ... но это может создать путаницу, а мы этого не хотим, не так ли?!? знак равноВместо этого используйте что-то вроде этого (я снова начну с самого начала):
Обратите внимание, что вы также можете назвать себя
data.frame
с помощьюdf
иletters
вместоg
, и результат будет в порядке. Собственно, этот код идентичен тому, который вы опубликовали, только названия изменены. Эта частьfactor(dtf$letter, levels = letters[4:1])
не вызовет ошибки, но может сбивать с толку!Внимательно прочтите
?factor
руководство! В чем разница междуfactor(g, levels = letters[4:1])
иfactor(g, labels = letters[4:1])
? Что похоже наlevels(g) <- letters[4:1]
иg <- factor(g, labels = letters[4:1])
?Вы можете использовать синтаксис ggplot, чтобы мы могли помочь вам в этом подробнее!
Ура !!!
Редактировать:
ggplot2
на самом деле требуется изменить и уровни, и значения? Хм ... Я откопаю это ...источник
Я хочу добавить еще один случай, когда уровни могут быть строками, содержащими числа вместе с некоторыми специальными символами: как в примере ниже
Уровни по умолчанию
x
:Здесь, если мы хотим изменить порядок уровней факторов в соответствии с числовым значением, без явной записи уровней, мы могли бы сделать следующее:
Надеюсь, это можно считать полезной информацией для будущих читателей.
источник
Вот моя функция для изменения порядка факторов данного фрейма данных:
Использование:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
источник