2012-04-25 10 views
14

tengo el siguiente hoja.de.datos en I:niveles de factor Reordenar por día de la semana en I

> daily 
     DoW   Duration 
1 Friday 14.0000000000000 
2 Monday 21.0000000000000 
3 Saturday 12.0000000000000 
4 Thursday 28.0000000000000 
5 Tuesday 12.0000000000000 
6 Wednesday 91.0000000000000 
7 Sunday 20.0000000000000 

me gustaría cambiar el orden de los niveles de factor de forma que las semanas están en (US) orden del día de la semana.

Parece que puedo hacer esto de una manera lenta y desconcertante con relevel(). Pero esto solo toma 1 argumento numérico y lo mueve a la cima. Entonces, relevel(daily$DoW, 7), mueve el domingo a la parte superior, pero el resto permanece desordenado (lo que significa que debo volver a subir el orden en orden inverso).

Doable, pero debe haber una manera mejor, ¿no?

(. Solución de series de tiempo también es aceptable)

Respuesta

18

es necesario especificar los niveles de los factores y luego usar order con la indexación:

daily$DoW <- factor(daily$DoW, levels= c("Sunday", "Monday", 
    "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")) 

daily[order(daily$DoW), ] 
+3

Comprobé si R tiene una constante de días de la semana incorporada como hace meses y parece que no. Pensé que sí. –

+1

Esto casi funcionó --- Implementé la línea final para ser una tarea, 'diario <- diario [orden (diario $ DoW),]' Pero noté que cuando hago un histograma con 'ggplot (diario, aes (x = DoW, y = Duration)) + geom_histogram() ', los factores se enumeran en el orden correcto en el eje x, pero no en el eje y --- es decir, los valores y siguen correspondiendo al antiguo posiciones de los valores x. es decir, el domingo es 14, en lugar de 20. – Mittenchops

+0

Sí, tal vez mi tarea era incorrecta, pero cuando escribo 'daily' ahora, el índice todavía aparece como' 7,2,5,6,4,1,3' , aunque la columna DoW ahora comienza con el domingo. – Mittenchops

1

En lugar de un factor, lo que quiere es un Ordered.Factor.

Esta línea de código R convierte la variable de DoW a un "factor ordenada":

daily$DoW <- ordered(daily$DoW, levels=c("Monday", "Tuesday", "Wednesday", "Thursday", 
"Friday", "Saturday", "Sunday")) 

Ahora cuando se utiliza table, plot o cualquier otra función en Dow Será el orden especificado anteriormente.

Cuestiones relacionadas