【问题标题】:compute daily average for a certain time period计算特定时间段的每日平均值
【发布时间】:2020-03-02 07:05:15
【问题描述】:

我有超过 50 年的每日数据。我需要生成一个包含每日数据平均值的新数据集。对于每一天,应该取平均值 包括过去 10 年和未来 10 年的每日数据。

这是一个可重现的示例。我从 1998 年到 2008 年有几年,二月和三月有 10 天。我需要做的是将 T1 和 T2 的新平均列分别计算为 T1avg 和 T2avg。需要计算每日平均值,以便它包含过去 4 年和未来 4 年的数据。对于 1998-2001 年和 2005-2008 年的平均作物 df,因为这些年份在之前或之后的 4 年都没有足够的数据。

例如 2002 年 2 月 28 日。如果 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。对于 2004 年 2 月 29 日,我只会平均 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
  ")

【问题讨论】:

  • 这听起来像是移动平均线。你试过搜索吗?

标签: r


【解决方案1】:

首先创建一个Date 类date 列,然后将数据框左连接到自身,这样对于第一个实例中的每个日期a,匹配第二个实例中的所有日期b,即4年内。然后按a 中的日期对b 中每个T1 和T2 列的平均值进行分组。

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

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2021-07-30
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多