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 factor
funçã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 levels
e, 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, letters
fornece 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.frame
com df
e em letters
vez 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 ?factor
manual 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:
ggplot2
realmente requer a alteração de níveis e valores? Hm ... eu vou desenterrar este ...