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 factor
funzione come suggerito da @Jonathan Chang, succede qualcosa di diverso: cambi i valori numerici stessi.
Stai ricevendo di nuovo un errore perché lo fai levels
e poi provi a rilanciarlo con factor
. Non farlo !!! Evitare Non utilizzare levels
o 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, letters
fornisce 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.frame
con df
e letters
invece 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 ?factor
attentamente 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:
ggplot2
richiede effettivamente di modificare sia i livelli che i valori? Hm ... lo tirerò fuori questo ...