如何计算R中5分钟间隔的总和

如何计算R中5分钟间隔的总和,r,sum,minute,R,Sum,Minute,我有一个数据集,包含6个不同站点每分钟的降水记录。我想每5分钟为每个电台做一次总结。 这些是我的数据集的前5行(总共有17280行): 我试图在互联网上寻求帮助,但我找不到一个对我有帮助的答案 我还需要houlry求和,为此我使用以下代码,但如果您想进行其他求和,则此代码是无用的 uur_alex = tapply(disdro$P_alex, as.POSIXct(trunc(disdro$date, "hour")), sum) 现在我想要一个代码,我可以用它来做不同的总结,所以5分钟(如

我有一个数据集,包含6个不同站点每分钟的降水记录。我想每5分钟为每个电台做一次总结。 这些是我的数据集的前5行(总共有17280行):

我试图在互联网上寻求帮助,但我找不到一个对我有帮助的答案

我还需要houlry求和,为此我使用以下代码,但如果您想进行其他求和,则此代码是无用的

uur_alex = tapply(disdro$P_alex, as.POSIXct(trunc(disdro$date, "hour")), sum)
现在我想要一个代码,我可以用它来做不同的总结,所以5分钟(如问题中所示),但也可以半小时。
我希望有人能帮助我。

一种方法是使用整数除法(
%/%
)将日期映射到5分钟的区块。如果使用
POSIXct
datetimes,则基础将是。您可以使用
aggregate
对这些块进行求和

x <- data.frame(date=Sys.time()+60*0:10,value1=0:10,value2=rnorm(11))

aggregate(.~as.numeric(date)%/%(5*60),data=x,FUN=sum)
  as.numeric(date)%/%(5 * 60)       date value1     value2
1                     4525797 1357739399      0  0.6209565
2                     4525798 6788697893     15 -1.4342917
3                     4525799 6788699393     40  0.8064627

x如果您熟悉SQL,您可以轻松创建SQL语句,将数据分组为5分钟的间隔。例如,在postgresql中,您可以使用以下内容:

select Now(), date_trunc('hour',Now()) + interval '1 minute' * trunc(date_part('minute',Now())/5)*5

我使用sqldf包来完成所有这些转换。

您可以使用
zoo
包中的
rollapply
来实现这一点。比如说,

require(zoo)
tester <- data.frame(x=1:100,y=1:100)    
output <- rollapply(tester,5,(sum),by=5,by.column=TRUE,align='right')
require(动物园)

tester
cut
可以很好地处理日期-时间对象,因此,可以使用它创建希望聚合的5分钟间隔。下面是一个例子:

首先,一些样本数据:

set.seed(1)
mydf <- data.frame(P_alex = sample(0:5, 40, replace = TRUE),
                   P_hvh = sample(0:3, 40, replace = TRUE),
                   date = as.POSIXct("2011-06-27 22:00:00") + 60 * 0:39)
list(head(mydf), tail(mydf))
# [[1]]
#   P_alex P_hvh                date
# 1      1     3 2011-06-27 22:00:00
# 2      2     2 2011-06-27 22:01:00
# 3      3     3 2011-06-27 22:02:00
# 4      5     2 2011-06-27 22:03:00
# 5      1     2 2011-06-27 22:04:00
# 6      5     3 2011-06-27 22:05:00
# 
# [[2]]
#    P_alex P_hvh                date
# 35      4     1 2011-06-27 22:34:00
# 36      4     3 2011-06-27 22:35:00
# 37      4     3 2011-06-27 22:36:00
# 38      0     1 2011-06-27 22:37:00
# 39      4     3 2011-06-27 22:38:00
# 40      2     3 2011-06-27 22:39:00

你是否每分钟有一个结果,或者是否有任何差距?对于一个站点,缺少一天,P_alex当天的值为NA谢谢,这是一个简单实用的答案!不幸的是,我丢失了日期,但这对我的进一步计算没有多大影响。我已编辑了您的答案,以提供有关您需要使用的包的信息
rollappy
。请记住,这只适用于data.frame中值的位置。我想我的数据集可能有问题,因为当我使用它时,我只得到3168个值,而不是3456个值……为什么
聚合
函数会多次与
一起使用~
,这是什么意思?@user3507584,这就像通过选择任何分组变量“聚合所有其他列”。使用dplyr,这一切都可以浓缩为以下内容(更容易理解):
mydf%>%group\u by(date=cut(mydf$date,5分钟))%%>%summary\u all(sum)
set.seed(1)
mydf <- data.frame(P_alex = sample(0:5, 40, replace = TRUE),
                   P_hvh = sample(0:3, 40, replace = TRUE),
                   date = as.POSIXct("2011-06-27 22:00:00") + 60 * 0:39)
list(head(mydf), tail(mydf))
# [[1]]
#   P_alex P_hvh                date
# 1      1     3 2011-06-27 22:00:00
# 2      2     2 2011-06-27 22:01:00
# 3      3     3 2011-06-27 22:02:00
# 4      5     2 2011-06-27 22:03:00
# 5      1     2 2011-06-27 22:04:00
# 6      5     3 2011-06-27 22:05:00
# 
# [[2]]
#    P_alex P_hvh                date
# 35      4     1 2011-06-27 22:34:00
# 36      4     3 2011-06-27 22:35:00
# 37      4     3 2011-06-27 22:36:00
# 38      0     1 2011-06-27 22:37:00
# 39      4     3 2011-06-27 22:38:00
# 40      2     3 2011-06-27 22:39:00
# Aggregate all columns by the intervals created with cut.
# For the dataset, we drop the original date column since
#   it is no longer needed here. Our function is "sum"
aggregate(. ~ cut(mydf$date, "5 min"), 
          mydf[setdiff(names(mydf), "date")], 
          sum)
#   cut(mydf$date, "5 min") P_alex P_hvh
# 1     2011-06-27 22:00:00     12    12
# 2     2011-06-27 22:05:00     16     8
# 3     2011-06-27 22:10:00     12     5
# 4     2011-06-27 22:15:00     17     6
# 5     2011-06-27 22:20:00     10     8
# 6     2011-06-27 22:25:00     11     8
# 7     2011-06-27 22:30:00     12     7
# 8     2011-06-27 22:35:00     14    13