Работа с коэффициентами в 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, чтобы мы могли помочь вам в этом!
Ура !!!
Edit:
ggplot2
на самом деле требуется изменить как уровни, так и значения? Хм ... Я выкопаю это ...