2013-01-23 8 views
5

Uczę się R, analizując wyniki wyścigu rowerowego i mam problemy z danymi o czasie (ile ktoś podjął, aby ukończyć wyścig).Jak pracować z czasem, odległością i prędkością?

Dane czasu mają format "HH: MM: SS".

Próbowałem konwertować go do posixct, ale dodaje składnik daty do niego. Próbowałem także pakietu chron, ale nie pozwoli mi on podzielić obiektu liczbowego przez czas Obiekt

Jedną z rzeczy, które chcę zrobić, to obliczyć średnią prędkość z tego czasu, więc muszę być w stanie podzielić odległość z czasem.

+3

konwertować je do sekundy lub mniejsza. Prezentacja z godzinami i minutami jest naprawdę tylko do prezentacji. –

+0

Możesz znaleźć pakiet 'lubridate' pomocny podczas pracy z datami. Jest plik PDF opisujący pakiet "Daty i Times Made Easy with iridate" opublikowany w Journal of Statistical Software. Szybkie wyszukiwanie spowoduje jego zwiększenie. – rrs

Odpowiedz

5

Pakiet chron ma klasy do radzenia sobie z czasami, a funkcją do wykorzystania jest, zaczekać na nie, times(). Oto przykład przy użyciu typowych razy za prowadzenie standardowego maraton:

library(chron) 
tms <- c("2:06:00", "3:34:30", "4:12:59") 
x <- times(tms) 

Masz teraz times obiekt, reprezentujący frakcje dziennie.

str(x) 
Class 'times' atomic [1:3] 0.0875 0.149 0.1757 
    ..- attr(*, "format")= chr "h:m:s" 

można wykonywać obliczenia prędkości, ale trzeba będzie przekształcić klasę z dates do numeryczna z as.numeric.

dist <- 42.2 
as.numeric(dist/x/24) 
[1] 20.09524 11.80420 10.00856 

I tam masz to: prędkości w km/h.

5

Chciałbym użyć POSIXct, dla którego masz zdecydowanie najsilniejsze wsparcie w bazie R i pakietach dodatków.

Ilekroć używam danych śróddziennych, dla których dzień nie ma znaczenia, po prostu dodaję datę bazową, powiedzmy, 1 stycznia bieżącego roku. Dla wszystkich porównań, różnic itp. To zmywa.

Także nuty: as.numeric() zmiennej POSIXct dostaje z powrotem do normalnych numerów (od seconds.subseconds od epoki), który jest przydatny zarówno dla arytmetyki aw przypadku trzeba przechowywać (w dB bez datetime), lub przenieść do innego systemu lub języków. Każdy ma zmiennoprzecinkowe --- i (ułamkowe) sekundy od epoki jest łatwe. POSIXct daje dodatkowe korzyści dla formatowania, Sekwencje różnic, kreślenia, ...

Oto mały przykład:

R> txt <- c("08:09:10", "09:10:11", "10:11:12", "11:12:13") 
R> times <- as.POSIXct(paste("2013-01-01", txt)) 
R> times 
[1] "2013-01-01 08:09:10 CST" "2013-01-01 09:10:11 CST" 
+ "2013-01-01 10:11:12 CST" "2013-01-01 11:12:13 CST" 
R> times - times[1] 
Time differences in secs 
[1]  0 3661 7322 10983 
attr(,"tzone") 
[1] "" 
R> as.numeric(times - times[1]) 
[1]  0 3661 7322 10983 
R> 
3

Co patrzysz naprawdę nie ma czasu, ale czas, który upłynął. Istnieją typy danych dla czasu, który upłynął. W base R, robi to klasa difftime.

tms <- c("2:06:00", "3:34:30", "4:12:59", "08:09:10", 
     "09:10:11", "10:11:12", "11:12:13") 

ta <- as.difftime(tms) 

który wyświetla jako

> ta 
Time differences in hours 
[1] 2.100000 3.575000 4.216389 8.152778 9.169722 10.186667 11.203611 
attr(,"tzone") 
[1] "" 
> format(ta) 
[1] " 2.100000 hours" " 3.575000 hours" " 4.216389 hours" " 8.152778 hours" " 9.169722 hours" 
[6] "10.186667 hours" "11.203611 hours" 

Można zrobić to z matematyki, jak również poprzez konwersję do numerycznej.

> 42.2/as.numeric(ta) 
[1] 20.095238 11.804196 10.008564 5.176150 4.602102 4.142670 3.766643 

Pakiet lubridate ma również typy, które zajmują się upływającego czasu, a konkretnie duration.

library("lubridate") 
ti <- as.duration(as.difftime(tms)) 

który wyświetla jako

> ti 
[1] 7560s (~2.1 hours) 12870s (~3.58 hours) 15179s (~4.22 hours) 29350s (~8.15 hours) 
[5] 33011s (~9.17 hours) 36672s (~10.19 hours) 40333s (~11.2 hours) 

i można zrobić z matematyki jest po konwersji na numeryczny (tutaj sekund zamiast godzin)

> 42.2/as.numeric(ti) 
[1] 0.005582011 0.003278943 0.002780157 0.001437819 0.001278362 0.001150742 0.001046290