2013-05-05 13 views
9

Mam ramkę danych DF z jedną z kolumn: data/czas i chciałbym zamówić ramkę danych w porządku malejącym tej kolumny.Data/czas zamówienia w porządku malejącym w R

DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10'), age=c(40,30,20)); 

ja najpierw konwertowane kolumnę end do et użyciu et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M') i stosować następujące, ale dostałem komunikat, że jednoargumentowy operator „-” nie została przyjęta do argumentu:

out <- DF[order(-DF$et),]; 

Próbowałem też użył flagi zstępującej, ale ponownie dostał błąd, że argumenty nie mają tej samej długości.

out <- DF[order(DF$et, descending=TRUE),]; 

Jednak kolejność rosnąco wydaje się działać: out <- DF[order(DF$et),].

Jak mogę zamówić w kolejności malejącej (ostatnio ostatni raz)? Dziękuję Ci.

+1

Nie ma argumentu o nazwie "malejąco". To "maleje". –

+1

Ponieważ jesteś tu nowy, możesz przeczytać [** about **] (http://stackoverflow.com/about) i [** faq **] (http://stackoverflow.com/faq) o tym, jak działa SO. StackOverflow jest ** bardzo ** bardziej wartościowy dla wszystkich, jeśli po otrzymaniu odpowiedzi rozwiązującej problem, akceptujesz go, klikając mały znacznik wyboru. Jesteś całkowicie ** ** zobowiązany, aby to zrobić, ale jest to świetny sposób, aby "zwrócić" do witryny, jeśli odpowiedź rzeczywiście rozwiąże twój problem i pomaga utrzymać czystość witryny poprzez usunięcie odpowiedzi na pytanie z stos pytań bez odpowiedzi. –

Odpowiedz

6

myślę, że to będzie działać:

## Slightly bigger dataset with two times on same day: 
DF <- data.frame(ID=c('ID3', 'ID2','ID1','ID4'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10' , '1/1/09 13:11'), age=c(40,30,20,20)); 

## Note to self - ALWAYS include a timezone. 
DF$DTime <- as.POSIXct(DF$end , format = "%d/%m/%y %H:%M" , tz = "GMT") 
DF[ order(DF$DTime , decreasing = TRUE),] 
# ID   end age    DTime 
#2 ID2 6/1/11 14:20 30 2011-01-06 14:20:00 
#1 ID3 4/1/10 12:00 40 2010-01-04 12:00:00 
#4 ID4 1/1/09 13:11 20 2009-01-01 13:11:00 
#3 ID1 1/1/09 11:10 20 2009-01-01 11:10:00 
+0

Czy to poprawnie sortuje wiersze z tego samego dnia, ale z różnych czasów? – joran

+2

Co z po prostu 'DF [rev (order (DF $ end))]? – joran

+0

@joran masz rację. 'POSIXct' jest lepsze (myślę). –

6

Nie jest to łatwe i ogólnie rozwiązanie problemu z kilkoma kodu.

Jak zauważyłeś, znak minus nie działa z datami, ponieważ daty ujemne jeszcze nie istnieją!

Jednak ten sam efekt można uzyskać za pomocą funkcji ogólnego przeznaczenia: rev(). Dlatego wymieszaj obroty i kolejność, takie jak:

#init data 
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10') 
#change order 
out <- DF[rev(order(as.Date(DF$end))),] 

Gdy używasz znaku minus z liczbami, w jednym przejściu klasyfikujesz liczby ujemne. Myślę, że kiedy używasz funkcji rev(), robisz dwa podania, jeden do sortowania w porządku rosnącym i jeden do odwracania zamówienia. Ale na 3 obserwacjach trudno to zobaczyć.

Mam nadzieję, że pomogło.

Powiązane problemy