首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对R中的5分钟间隔求和

如何对R中的5分钟间隔求和
EN

Stack Overflow用户
提问于 2013-01-09 21:30:42
回答 4查看 4.7K关注 0票数 3

我有一个数据集,记录了6个不同站点每分钟的降水量记录。我希望每个电台每隔5分钟就有一次总结。下面是我的数据集的前5行(总共有17280行):

代码语言:javascript
复制
  P_alex P_hvh P_merlijn P_pascal P_thurlede P_tosca                date
    0     0         0        0          0       0 2011-06-27 22:00:00
    0     1         5        2          0       0 2011-06-27 22:01:00
    0     0         0        0          0       0 2011-06-27 22:02:00
    0     6         2        3          0       0 2011-06-27 22:03:00
    0     0         0        0          0       0 2011-06-27 22:04:00

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

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

代码语言:javascript
复制
uur_alex = tapply(disdro$P_alex, as.POSIXct(trunc(disdro$date, "hour")), sum)

现在我想要一个代码,我可以用来做不同的总结,所以5分钟(如问题所示),但也有半个小时。我希望有人能帮助我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-09 22:03:21

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

代码语言:javascript
复制
require(zoo)
tester <- data.frame(x=1:100,y=1:100)    
output <- rollapply(tester,5,(sum),by=5,by.column=TRUE,align='right')
票数 4
EN

Stack Overflow用户

发布于 2013-01-10 00:33:03

cut可以很好地处理date-time对象,因此可以用来创建您希望汇总的5分钟间隔。下面是一个例子:

首先是一些样本数据:

代码语言:javascript
复制
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

在下面的示例中,我们聚合了原始dataset中的所有列,但删除了dataset中的"date“变量(使用mydf[setdiff(names(mydf), "date")])。

代码语言:javascript
复制
# 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
票数 7
EN

Stack Overflow用户

发布于 2013-01-09 21:55:12

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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14236349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档