2015-06-01 2 views
1

У меня есть кадр данных ежедневных измерений температуры, охватывающих 20 лет. Я хотел бы рассчитать годовой диапазон в серии данных за каждый год (т. Е. В итоге 20 значений, представляющих диапазон для каждого года). Пример данных:расчет сезонного диапазона в r в течение ряда лет

begin_date = as.POSIXlt("1990-01-01", tz = "GMT") 
dat = data.frame(dt = begin_date + (0:(20*365)) * (86400)) 
dat = within(dat, {speed = runif(length(dt), 1, 10)}) 

Я думал писать цикл, который проходит через каждый год, а затем вычислить диапазон, но надеялся, что там было другое решение.

Я думаю, что лучшим способом продвижения было бы максимальное и минимальное значения для каждого года, а затем рассчитать диапазон от этого. Может ли кто-нибудь предложить метод для этого без написания цикла, который будет проходить каждый год индивидуально?

+0

применять или sapply функции? я уверен, что есть большой функциональный, один линейный подход к нему. – duffymo

+0

Попробуйте 'library (dplyr); dat%>% group_by (year = year (dt))%>% summary = Max = max (скорость), Min = min (скорость))' Или может быть 'dat%>% group_by (год = год (дт))%>% суммировать (Range = toString (раунд (диапазон (скорость), 2))) ' – akrun

ответ

0

Попробуйте

library(dplyr) 
dat %>% 
    group_by(year=year(dt)) %>% 
    summarise(Range=diff(range(speed))) 

Или

library(data.table) 
setDT(dat)[, list(Range=diff(range(speed))), year(dt)] 

Или

aggregate(speed~cbind(year=year(dt)), dat, function(x) diff(range(x)))