Робота з факторами 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, трапляється щось інше: ви самі змінюєте числові значення.
Ви знову отримуєте помилку через те, що ви робите, levels
а потім намагаєтесь видалити її factor
. Не робіть цього !!! Ви НЕ використовуєте , levels
або ви будете накоїти (якщо ви точно не знаєте , що ви робите).
Одна пропозиція lil: уникайте називати ваші об'єкти ідентичною назвою об'єктів R ( df
це функція щільності для розподілу F, letters
дає малі літери алфавіту). У цьому конкретному випадку ваш код не був би несправним, але іноді це може бути ... але це може створити плутанину, і ми цього не хочемо, чи не так?!? =)
Замість цього використовуйте щось подібне (я ще раз піду):
> 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
і 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
насправді вимагає змінити і рівні, і значення? Гм ... я це викопаю ...