2017-10-01 40 views
7

Chciałbym znaleźć datę minimalnej i maksymalnej wartości obiektu R ts(). Wypróbowałem funkcje i zwracam tylko "numer wiersza". Chciałbym wypisać aktualną datę. Dziękuję Ci.R Obiekt serii ts() Data minimalna i maksymalna

data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) 
data 
which.min(data) 
which.max(data) 

Odpowiedz

4

W ten sposób można znaleźć rok i miesiąc na minutę i maksymalnej wartości w danych:

> data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) 
> data 
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
2012 0.18 -0.07 -0.77 1.23 -0.97 1.20 -1.41 1.39 -0.72 -0.94 0.28 0.97 
2013 -0.86 -0.57 -0.16 -1.24 -0.35 -0.06 0.78 1.32 1.80 -0.51 -1.91 1.14 
2014 -0.51 1.21 0.14 0.30 1.18 -0.32 -0.92 -0.46 -0.97 -0.94 -1.56 -0.63 
2015 0.13 0.93 -1.45 1.97 0.04 0.55 0.45 0.13 1.14 0.27 0.15 -1.39 
2016 0.68 2.16 -1.56 -0.44 1.07 1.27 1.01 -2.93 -0.19 -0.70 1.44 0.09 

odpowiednią datą minimalnej data jest

> data_min_value <- data[which.min(data)] 
> data_min_value 
[1] -2.93 
> data_min_value_time <- time(data)[which.min(data)] 
> data_min_value_time 
[1] 2016.583 
> data_min_value_year <- floor(time(data)[which.min(data)]) 
> data_min_value_year 
[1] 2016 
> data_min_value_month <- (time(data)[which.min(data)] %% 1)*12 
> data_min_value_month 
[1] 7 
> data_min_value_month_abb <- month.abb[(time(data)[which.min(data)] %% 1)*12+1] 
> data_min_value_month_abb 
[1] "Aug" 

Data maksimum wartość otrzymujesz podobnie

> data[which.max(data)] 
[1] 2.16 
> floor(time(data)[which.max(data)]) # Year 
[1] 2016 
> month.abb[(time(data)[which.max(data)] %% 1)*12+1] # Abbreviation of month 
[1] "Feb" 

Poniżej znajduje się podsumowanie przydatnych funkcji, które zostały użyte w powyższych przykładach:

> floor(2016.563) # find out the integer part on the number 
[1] 2016 
> 2016.563 %% 1 # find out the fractional part on the number 
[1] 0.563 
> month.abb[0.563*12+1] # find out the abbreviation of the month name 
[1] "Jul" 
5

Oto jak ja sobie z tym poradzić, ale nie jestem zaznajomiony z ts i jestem pewien, że jest lepszym rozwiązaniem.

Aby pobrać datę z pozycji max/min, można indeksować obiekt utworzony przez time na swoim ts. Np .: time(data)[which.max(data)]; to samo dla which.min.

Następnie do konwersji na odpowiedni rok (łatwe) i miesiąca (trudne) indeks, zwykle utworzyć tę funkcję:

numyear2monthyear <- function(x){ 
    c(trunc(x),     # entire part = year 
    round((x-floor(x))*12 + 1)) # decimal part * 12 + 1 (Jan=0) = Month 
} 

Oto przykład:

set.seed(123) # for the sake of reproducibility 
data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) 
data 
     Jan Feb Mar Apr May Jun Jul Aug 
2012 -0.56 -0.23 1.56 0.07 0.13 1.72 0.46 -1.27 
2013 0.40 0.11 -0.56 1.79 0.50 -1.97 0.70 -0.47 
2014 -0.63 -1.69 0.84 0.15 -1.14 1.25 0.43 -0.30 
2015 0.55 -0.06 -0.31 -0.38 -0.69 -0.21 -1.27 2.17 
2016 0.78 -0.08 0.25 -0.03 -0.04 1.37 -0.23 1.52 
Sep Oct Nov Dec 
2012 -0.69 -0.45 1.22 0.36 
2013 -1.07 -0.22 -1.03 -0.73 
2014 0.90 0.88 0.82 0.69 
2015 1.21 -1.12 -0.40 -0.47 
2016 -1.55 0.58 0.12 0.22 

which.min(data) 
[1] 18 
which.max(data) 
[1] 44 

numyear2monthyear(time(data)[which.max(data)]) 
[1] 2015 8 

numyear2monthyear(time(data)[which.min(data)]) 
[1] 2013 6 

i zwykle zamień to w inną przydatną funkcję, taką jak:

extrema_dates <- function(ts){ 
    ts_min_date <- numyear2monthyear(time(ts)[which.min(ts)]) 
    ts_max_date <- numyear2monthyear(time(ts)[which.max(ts)]) 
    list(min=min(ts), 
     min_year=ts_min_date[1], 
     min_month=ts_min_date[2], 
     max=max(ts), 
     max_year=ts_max_date[1], 
     max_month=ts_max_date[2]) 
} 

> extrema_dates(data) 
$min 
[1] -1.97 

$min_year 
[1] 2013 

$min_month 
[1] 6 

$max 
[1] 2.17 

$max_year 
[1] 2015 

$max_month 
[1] 8 

Mam nadzieję, że rozwiąże to Twój problem (i będzie to hap py, aby zobaczyć lepszą opcję, aby to zrobić).

+2

Maybe 'lubridate :: date_decimal (czas (dane) [which.min (data)], tz = "UTC") ' –

+1

' as.Date.yearmon (time (data) [which.max (data)]) ' –

3

Daje to obiekt klasy yearmon za minimum. To samo z which.max będzie działać na maksimum.

library(zoo) 

imin <- which.min(data) 
tmin <- time(as.zoo(data))[imin] 
tmin 
## [1] "Dec 2016" 

as.integer(tmin), cycle(tmin) i as.Date(tmin) dałoby rok, miesiąc (w liczbie od 1 do 12) i przy użyciu obiektu klasy Data z dniem 1 miesiąca odpowiednio.

Alternatywnie time(data)[imin], as.integer(time(data))[imin] i cycle(data)[imin] daje czas w roku + frakcji lat jako całkowitą liczbę i miesięcy. Te trzy nie używają żadnych pakietów.

3

Moim ulubionym narzędziem dla szeregów czasowych jest xts i ts obiekty tłumaczyć czysto:

library(xts) 
x = as.xts(data) 

Wyjścia:

> min(index(x)) 
[1] "Jan 2012" 
> max(index(x)) 
[1] "Dec 2016"