2012-04-25 8 views
14

Mam następujący data.frame w R:poziomy czynnika Reorder według dnia tygodnia w R

> 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 

chciałbym zmienić kolejność poziomów czynników tak, że są w tydzień (US) zamówienie na dzień tygodnia.

Wygląda na to, że mogę to zrobić w powolny, zagadkowy sposób za pomocą relevel(). Ale to tylko bierze 1 argument numeryczny i przenosi go na szczyt. Tak więc relevel(daily$DoW, 7) przesuwa się w niedzielę na górę, ale reszta pozostaje nieuporządkowana (co oznacza, że ​​muszę wydać ją w odwrotnej kolejności).

Można to zrobić, ale musi być lepszy sposób, prawda?

(. Rozwiązanie szeregów czasowych również dopuszczalne)

Odpowiedz

18

musisz określić poziomy w czynnik, a następnie użyć order z indeksowaniem:

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

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

Sprawdziłem, czy R ma stałe dni w tygodniu, tak jak ma to miejsce w przypadku miesięcy i nie wydaje się. Pomyślałem, że tak. –

+1

To prawie zadziałało --- Zaimplementowałem ostatnią linię jako zadanie, 'daily <- daily [order (daily $ DoW)]' Ale zauważam, że kiedy robię histogram z niego za pomocą 'ggplot (codziennie, aes (x = DoW, y = Czas trwania)) + geom_histogram() ', czynniki są wymienione we właściwej kolejności na osi X, ale nie na osi y --- to znaczy wartości y nadal odpowiadają starym pozycje wartości x. tj. niedziela jest 14, zamiast 20. – Mittenchops

+0

Tak, może moje zadanie było nieprawidłowe, ale kiedy po prostu wpisuję "codziennie" teraz, indeks jest nadal wymieniony jako "7,2,5,6,4,1,3" , mimo że kolumna DoW zaczyna się teraz w niedzielę. – Mittenchops

1

Zamiast factor, co chcesz to Ordered.Factor.

Ta linia kodu R konwertuje zmienną DoW do Factor „na zamówienie”:

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

Teraz podczas korzystania table, plot lub jakichkolwiek innych funkcji Dow będzie to zamówienie określono powyżej.