2017-10-01 5 views
7

Je souhaite trouver la date des valeurs minimale et maximale dans un objet R ts(). J'ai essayé les fonctions which.min et which.max mais elles ne renvoient que le "numéro de rangée". Je voudrais sortir la date réelle. Je vous remercie.R Objet de série temporelle ts() Date du minimum et du maximum

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

Répondre

4

Voici comment trouver l'année et le mois de la valeur min et max dans les données:

> 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 

La date correspondant à la date minimum est

> 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" 

La date du maximum valeur que vous obtenez de manière similaire

> 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" 

Vous trouverez ci-dessous un résumé des fonctions utiles qui ont été utilisées. dans les exemples ci-dessus:

> 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

Voici comment je traite cela, mais je ne suis pas familier avec ts et je suis sûr qu'il ya une meilleure option. Pour récupérer la date à partir de la position max/min, vous pouvez indexer l'objet créé par time sur votre ts. Par exemple: time(data)[which.max(data)]; Idem pour which.min.

ensuite pour convertir cela en une année appropriée (facile) et mois (difficile) index, je crée habituellement cette fonction:

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

est un exemple:

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 

Et généralement, je transformer cela en une autre fonction pratique, comme:

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 

J'espère que cela résout votre problème (et serait hap py pour voir une meilleure option pour le faire).

+2

Peut-être que 'lubridate :: date_decimal (temps (données) [which.min (données)], tz = "UTC") ' –

+1

' as.Date.yearmon (heure (données) [which.max (données)]) ' –

3

Ceci donne un objet classe yearmon pour le minimum. La même chose avec which.max fonctionnerait pour le maximum.

library(zoo) 

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

as.integer(tmin), cycle(tmin) et as.Date(tmin) donnerait l'année, le mois (en nombre compris entre 1 et 12) et un objet de classe Date utilisant le 1er du mois respectivement.

Alternativement, time(data)[imin], as.integer(time(data))[imin] et cycle(data)[imin] donnera le temps que l'année + fraction, année entier et le numéro mois. Ces trois n'utilisent aucun paquet.

3

Mon outil préféré pour les séries chronologiques est xts et ts objets traduire proprement:

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

Sorties:

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