【问题标题】:How to take a 5-day average around a specific date in r如何在r中的特定日期取5天平均值
【发布时间】:2014-10-13 07:01:02
【问题描述】:

所以我有一个看起来像这样但没有周末的数据集:

 X1          X2
3798 2009-12-29           0
3799 2009-12-30           0
3800 2009-12-31           0 
3802 2010-01-02           0
3803 2010-01-03         2.1
3804 2010-01-04           0
3805 2010-01-05           0
3806 2010-01-06           0
3807 2010-01-07           0
3808 2010-01-08           0
3809 2010-01-09           0
3810 2010-01-10         6.8
3811 2010-01-12           0
3812 2010-01-13           0
3813 2010-01-14        17.7
3814 2010-01-16           0
3815 2010-01-17           0
3816 2010-01-18         1.5
3817 2010-01-19           0
3818 2010-01-20           0
3819 2010-01-21           0
3820 2010-01-22           0
3821 2010-01-23           0
3822 2010-01-24           0
3823 2010-01-25           0
3824 2010-01-26           0
3825 2010-01-27         4.5
3826 2010-01-28           0
3827 2010-01-29           0
3828 2010-01-31           0
3829 2010-02-01           0
3830 2010-02-03           0
3831 2010-02-04           0
3832 2010-02-05           0
3833 2010-02-07           0
3834 2010-02-08           0
3835 2010-02-09         1.2  

我想在每个月的第 15 天左右取 5 天平均值,如果 15 号发生在周末并且数据集中不存在,我想取最接近的 5 天平均值日期(14 日或 16 日),这可能吗?

所以这是预期的输出

 X1          X2         5-day average
 1         2009-12-14           2
 2         2010-01-15           3 
 3         2010-02-15           4
 4         2010-03-16           2 
 5         2010-04-15           1
 6         2010-05-14           7

【问题讨论】:

  • 目前还不清楚预期的结果是什么。您能否显示此示例数据的预期输出?
  • 嗨,akrun,我编辑了帖子以添加预期的输出,我希望现在很清楚。
  • 我的数据与这个有点不同,但想法很简单,我想在每个月的 15 号左右找到一个 5 天的平均值,如果 15 号不存在,我想找出最接近 15 日的 5 天平均值
  • Al_Fawzan 假设 df 是数据集,因为您提到要删除周末 indx <- !(weekdays(df$X1) %in% c('Saturday', 'Sunday'));df1 <- df[indx,]。那么我的猜测是你需要rollapply,就像影子建议的那样。 df1$rmmean <- with(df1, rollapply(X2, 5, mean, fill=NA))。在当前示例中,我只有一个接近 15h 的值。 2010-01-14 17.7 3.84
  • 是的(rollapply)有效。但是我怎样才能提取我需要的日期(每个月的 15 日或最近的日期)?谢谢。

标签: r


【解决方案1】:

使用来自zoorollapply 函数很容易获得滚动平均值。然后您可以提取您需要的那些(即每个月的 15 号左右)。

# packages used
require(data.table)
require(zoo)
# data preparation
df <- read.table(text=' X1          X2
                 3798 2009-12-29           0
                 3799 2009-12-30           0
                 3800 2009-12-31           0 
                 3802 2010-01-02           0
                 3803 2010-01-03         2.1
                 3804 2010-01-04           0
                 3805 2010-01-05           0
                 3806 2010-01-06           0
                 3807 2010-01-07           0
                 3808 2010-01-08           0
                 3809 2010-01-09           0
                 3810 2010-01-10         6.8
                 3811 2010-01-12           0
                 3812 2010-01-13           0
                 3813 2010-01-14        17.7
                 3814 2010-01-16           0
                 3815 2010-01-17           0
                 3816 2010-01-18         1.5
                 3817 2010-01-19           0
                 3818 2010-01-20           0
                 3819 2010-01-21           0
                 3820 2010-01-22           0
                 3821 2010-01-23           0
                 3822 2010-01-24           0
                 3823 2010-01-25           0
                 3824 2010-01-26           0
                 3825 2010-01-27         4.5
                 3826 2010-01-28           0
                 3827 2010-01-29           0
                 3828 2010-01-31           0
                 3829 2010-02-01           0
                 3830 2010-02-03           0
                 3831 2010-02-04           0
                 3832 2010-02-05           0
                 3833 2010-02-07           0
                 3834 2010-02-08           0
                 3835 2010-02-09         1.2', header=TRUE)
setDT(df)
df[, X1 <- as.Date(X1)]
setkey(df, X1)
# taking rolling averages
df[, rmean:=rollapply(X2, 5, mean, fill=NA)]
# extracting the rolling averages you need
dt <- df[, list(day15=abs(mday(X1)-15) == min(abs(mday(X1)-15)), X1, rmean), by=list(year(X1), month(X1))]
dt[day15==TRUE]
dt[day15==TRUE, .SD[1,] ,by=list(month, year)]

【讨论】:

  • 谢谢影子,你是一个救生员。问题是我有一组 10 年的数据(120 个月),而我的滚动平均值还不错。当我运行提取代码时,我只得到第一年第一个月的一个值。它应该是 120 个单独的值
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多