2017-10-01 22 views

Trả lời

4

Đây là cách bạn tìm ra năm và tháng của giá trị min và max trong các dữ liệu:

> 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 

Ngày tương ứng của ngày tối thiểu là

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

Ngày tối đa giá trị bạn nhận được tương tự

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

Dưới đây là tóm tắt về các chức năng hữu ích đã được sử dụng trong các ví dụ trên:

> 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

Đây là cách tôi giải quyết vấn đề đó nhưng tôi không quen thuộc với ts và tôi chắc chắn có một tùy chọn tốt hơn.

Để truy lục ngày từ vị trí tối đa/phút, bạn có thể lập chỉ mục đối tượng được tạo bởi time trên ts. Ví dụ: time(data)[which.max(data)]; tương tự cho which.min.

Sau đó, để chuyển đổi này vào một năm thích hợp (dễ dàng) và tháng (khó khăn) chỉ số, tôi thường tạo ra chức năng này:

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

Dưới đây là một ví dụ:

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 

Và thường tôi biến điều đó thành một chức năng hữu ích khác, như:

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 

Tôi hy vọng nó sẽ giải quyết được vấn đề của bạn (và sẽ là hap py để xem một lựa chọn tốt hơn để làm điều đó).

+2

lẽ 'lubridate :: date_decimal (thời gian (dữ liệu) [which.min (data)], tz = "UTC") ' –

+1

' as.Date.yearmon (thời gian (dữ liệu) [which.max (data)]) ' –

3

Điều này mang lại một đối tượng lớp năm cho mức tối thiểu. Tương tự với which.max sẽ hoạt động tối đa.

library(zoo) 

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

as.integer(tmin), cycle(tmin)as.Date(tmin) sẽ cung cấp cho năm, tháng (như số từ 1 đến 12) và một đối tượng Date lớp sử dụng ngày 1 tháng tương ứng.

Cách khác, time(data)[imin], as.integer(time(data))[imin]cycle(data)[imin] sẽ cho thời gian như năm + phần, năm như số nguyên và tháng số. Ba gói này không sử dụng bất kỳ gói nào.

3

công cụ ưa thích của tôi cho chuỗi thời gian là xts, và ts đối tượng dịch sạch:

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

Đầu ra:

> min(index(x)) 
[1] "Jan 2012" 
> max(index(x)) 
[1] "Dec 2016" 
Các vấn đề liên quan