Lidar com fatores em R é um trabalho bastante peculiar, devo admitir ... Ao reordenar os níveis dos fatores, você não está reordenando os valores numéricos subjacentes. Aqui está uma pequena demonstração:
> 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"
Agora, se você converter esse fator para numérico, obterá:
# 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
Como você pode ver ... alterando os níveis, você altera apenas os níveis (quem diria, hein?), Não os valores numéricos! Mas, quando você usa a factorfunção como sugerido por Jonathan Chang, algo diferente acontece: você mesmo altera os valores numéricos.
Você está recebendo erro mais uma vez, porque o faz levelse, em seguida, tente identificá-lo factor. Não faça !!! Você não usarlevels ou você vai bagunçar as coisas (a menos que você saiba exatamente o que está fazendo).
Uma sugestão: evite nomear seus objetos com um nome idêntico aos objetos de R ( dfé a função de densidade da distribuição F, lettersfornece letras minúsculas do alfabeto). Nesse caso em particular, seu código não seria defeituoso, mas às vezes pode ser ... mas isso pode criar confusão, e nós não queremos isso, queremos?!? =)
Em vez disso, use algo assim (voltarei desde o início mais uma vez):
> 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
Observe que você também pode nomear você data.framecom dfe em lettersvez de g, e o resultado será OK. Na verdade, esse código é idêntico ao que você postou, apenas os nomes são alterados. Esta partefactor(dtf$letter, levels = letters[4:1]) não geraria um erro, mas pode ser confusa!
Leia o ?factormanual completamente! Qual é a diferença entre factor(g, levels = letters[4:1])e factor(g, labels = letters[4:1])? O que há de semelhante em levels(g) <- letters[4:1]e g <- factor(g, labels = letters[4:1])?
Você pode colocar a sintaxe do ggplot, para que possamos ajudá-lo mais nesta questão!
Felicidades!!!
Editar:
ggplot2realmente requer a alteração de níveis e valores? Hm ... eu vou desenterrar este ...