聚合日期并计算平均值

4

我有一个数据框,其中一列是长列表日期,另一列则是数值。它的样子如下:

set.seed(1234)
df <- data.frame(date= as.Date(c('2010-09-05', '2011-09-06', '2010-09-13', 
                                 '2011-09-14', '2010-09-23', '2011-09-24',
                                 '2010-10-05', '2011-10-06', '2010-10-13', 
                                 '2011-10-14', '2010-10-23', '2011-10-24')),
                 value= rnorm(12))

我需要计算每个月的每个10天期间的平均值,但与年份无关,就像这样:
dfNeeded <- data.frame(datePeriod=c('period.Sept0.10', 'period.Sept11.20', 'period.Sept21.30',
                                    'period.Oct0.10', 'period.Oct11.20', 'period.Oct21.31'),
                       meanValue=c(mean(df$value[c(1,2)]), 
                                   mean(df$value[c(3,4)]),
                                   mean(df$value[c(5,6)]),
                                   mean(df$value[c(7,8)]), 
                                   mean(df$value[c(9,10)]),
                                   mean(df$value[c(11,12)])))

有没有更快的方法做到这一点?
2个回答

5

以下是一种方法,使用lubridate软件包来提取月份和日期,但你也可以使用基本的R日期函数:

library(lubridate)
df$period <- paste(month(df$date),cut(day(df$date),breaks=c(0,10,20,31)),sep="-")
aggregate(df$value, list(period=df$period), mean)

这将会给出:

      period          x
1  10-(0,10] -0.5606859
2 10-(10,20] -0.7272449
3 10-(20,31] -0.7377896
4   9-(0,10] -0.4648183
5  9-(10,20] -0.6306283
6  9-(20,31]  0.4675903

也许调用 month(.) 函数,如:month(df$date, label = TRUE) 可以更接近 OP 的“精确”答案。cut 是一个非常方便的函数! - Arun
非常出色,非常感谢。我正在尝试将聚合函数的学习限制在plyr函数中,因此我选择了这段代码:df$period <- paste(month(df$date,label=T),cut(day(df$date),breaks=c(0,10,20,31)),sep="-") library(plyr) ddply(df, .(period), summarise, meanValue=mean(value)) - luciano

2

使用format.Date和模算术的方法应该相对较快:

tapply(df$value, list( format(df$date, "%b"), as.POSIXlt(df$date)$mday %/% 10), mean)
            0         1        2
Oct -0.560686 -0.727245 -0.73779
Sep -0.464818 -0.630628  0.46759

我不确定它与聚合方法相比如何:

aggregate(df$value, list( format(df$date, "%b"), as.POSIXlt(df$date)$mday %/% 10), mean)
  Group.1 Group.2         x
1     Oct       0 -0.560686
2     Sep       0 -0.464818
3     Oct       1 -0.727245
4     Sep       1 -0.630628
5     Oct       2 -0.737790
6     Sep       2  0.467590

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接