Я должен признать, что иметь дело с факторами в 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
или вы будете натворить (если вы точно не знаете , что вы делаете).
Одно небольшое предложение: избегайте называть свои объекты такими же именами, как объекты 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
на самом деле требуется изменить и уровни, и значения? Хм ... Я откопаю это ...