Affrontare i fattori in R è un lavoro piuttosto peculiare, devo ammetterlo ... Mentre riordini i livelli dei fattori, non stai riordinando i valori numerici sottostanti. Ecco una piccola dimostrazione:
> 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"
Ora, se converti questo fattore in numerico, otterrai:
# 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
Come puoi vedere ... cambiando i livelli, cambi solo i livelli (chi lo direbbe, eh?), Non i valori numerici! Ma, quando usi la factorfunzione come suggerito da @Jonathan Chang, succede qualcosa di diverso: cambi i valori numerici stessi.
Stai ricevendo di nuovo un errore perché lo fai levelse poi provi a rilanciarlo con factor. Non farlo !!! Evitare Non utilizzare levelso ti complicare le cose (a meno che non si sa esattamente cosa si sta facendo).
Un piccolo suggerimento: evita di nominare i tuoi oggetti con un nome identico agli oggetti di R ( dfè la funzione di densità per la distribuzione F, lettersfornisce lettere dell'alfabeto minuscole). In questo caso particolare, il tuo codice non sarebbe difettoso, ma a volte può essere ... ma questo può creare confusione, e non lo vogliamo, vero?!? =)
Invece, usa qualcosa di simile (vado dall'inizio ancora una volta):
> 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
Nota che puoi anche nominarti data.framecon dfe lettersinvece di g, e il risultato sarà OK. In realtà, questo codice è identico a quello che hai pubblicato, cambiano solo i nomi. Questa partefactor(dtf$letter, levels = letters[4:1]) non genererebbe un errore, ma può essere fonte di confusione!
Leggi ?factorattentamente il manuale! Qual è la differenza tra factor(g, levels = letters[4:1])e factor(g, labels = letters[4:1])? Cosa c'è di simile in levels(g) <- letters[4:1]e g <- factor(g, labels = letters[4:1])?
Puoi inserire la sintassi ggplot, così possiamo aiutarti di più su questo!
Saluti!!!
Modificare:
ggplot2richiede effettivamente di modificare sia i livelli che i valori? Hm ... lo tirerò fuori questo ...