рассчитать среднесуточное значение за определенный период времени - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть ежедневные данные за 50 лет. Мне нужно сгенерировать новый набор данных с усредненными значениями ежедневных данных. Для каждого дня среднее значение следует принимать как включающее ежедневные данные за последние 10 лет и будущие 10 лет.

Вот воспроизводимый пример. У меня годы 1998-2008 и 10 дней месяцев февраль и март. Что мне нужно сделать, так это вычислить новые усредненные столбцы T1 и T2 как T1avg и T2avg соответственно. Среднесуточное значение должно быть рассчитано таким образом, чтобы оно включало данные за последние 4 и последующие 4 года. Для усреднения урожая по df за 1998-2001 и 2005-2008 гг. С тех лет не будет достаточно данных за 4 года до или после.

Например, за 28 февраля 2002 г. Мне нужно усреднить значения, если T1 иT2 за дни 02/28 / 1998,02 / 28 / 1999,02 / 28 / 2000,02 / 28 / 2001,02 / 28 / 2002,02 / 28 / 2003,02 / 28 / 2004,02 / 28/2005, 02 / 28/2006. Для 29 февраля 2004 года я бы просто усреднил 02/29 / 200,02 / 29 / 2004,02 / 29/2008.

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

#Generate data
df<-as.data.frame(cbind(year=rep(1998:2008,each=20),

     month=c(rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10)),

    day=c(19:28,1:10,19:28,1:10,20:29,1:10,
    19:28,1:10,19:28,1:10,19:28,1:10,
    20:29,1:10,19:28,1:10,19:28,1:10,
    19:28,1:10,20:29,1:10),
T1=rnorm(220),
T2=rnorm(220)))

##################### Среднесуточные данные ########################

sqldf("
select
month,
day,
year,
T1,
T2,
  avg(T1) as T1_avg
  ,avg(T2) as T2_avg

  from df 
  group by 
   month, day
  ")

1 Ответ

0 голосов
/ 06 ноября 2019

Сначала создайте столбец Date class date, а затем присоедините левый фрейм данных к себе таким образом, чтобы для каждой даты в первом экземпляре, a, совпадали все даты во втором экземпляре, b, чтов течение 4 лет. Затем группировка по дате в среднем a по каждому из столбцов T1 и T2 в b.

library(sqldf)

df2 <- transform(df, date = as.Date(paste(year, month, day, sep = "-")))

df3 <- sqldf("select a.*, avg(b.T1) as avg_T1, avg(b.T2) as avg_T2 from df2 a
  left join df2 b on b.date between a.date - 4*365+1 and a.date + 4*365+1
  group by a.date")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...