繁体   English   中英

重新分组不规则的时间序列数据(带有元数据)

[英]R aggregating irregular time series data by groups (with meta data)

嗨,我有一个数据帧(约400万行),其中包含针对不同站点和事件的时间序列数据。

这是我的数据的粗略概念,显然是在不同的规模上,我有几个相似的时间序列,所以我将其保留为一般性,因为我希望能够在不同情况下应用它

Data1 <- data.frame(DateTimes =as.POSIXct("1988-04-30 13:20:00")+c(1:10,12:15,20:30,5:13,16:20,22:35)*300,
                      Site = c(rep("SiteA",25),rep("SiteB",28)),
                      Quality = rep(25,53),
                      Value = round(runif(53,0,5),2),
                      Othermetadata =  c(rep("E1",10),rep("E2",15),rep("E1",10),rep("E2",18)))

我正在寻找的是一种简单的方法,可以将数据分组并聚合到不同的时间步,同时保留组内不变的元数据

我试过使用Zoo Library和Zoo :: aggregate即:

library(zoo)
zooData <- read.zoo(select(Data1, DateTimes, Value))
zooagg <- aggregate(zooData, time(zooData) - as.numeric(time(zooData))%%3600, FUN = sum, reg = T)

但是,当我这样做时,我将丢失所有元数据并合并不同的站点数据。

我想知道如何尝试使用plyr或dplyr拆分数据,然后应用聚合,但我仍然会丢失其他列。

有一个更好的方法吗? 我对xts库的doco进行了简要介绍,但是在两者中都看不到直观的解决方案

*注意:由于我希望此功能可用于一些不同的事情,因此开始时间步骤和最终时间步骤都可能会发生变化。 有可能出现随机时间步长,或者有些规律的时间步长,但缺少分数。 并且所应用的FUN可能有所不同(主要是总和或平均值)。 以及我想用*分割的字段


编辑在大力神Apergis向正确的方向推动我之后,我找到了解决方案。

newData <- Data1 %>% group_by(timeagg, Site) %>% summarise(Total = sum(Value))
finaldata <- inner_join(Data1,newData) %>% select(-DateTimes, - Value) %>% distinct()

原始的DateTimes列不是分组变量-而是时间序列,因此我添加了汇总时间(这里是最近的小时数)的分组变量,并对此进行了总结。 问题是,如果我加入了这个新专栏,那么我会错过该小时内有时间但没有小时的所有时间点。 因此,inner_join%>%选择%>%不同的方法。 现在希望它适用于我的真实数据而不是数据!

鉴于您具有聚合功能:

aggregate(zooData, time(zooData) - as.numeric(time(zooData))%%3600, FUN = sum, reg = T)

您要按时间组对值求和,并且不要丢失其他列。 您只需使用dplyr软件包即可:

library(dplyr)
newdata   <- Data1 %>% group_by(DateTimes) %>% summarise(sum(Value))
finaldata <- inner_join(Data1,newdata),by="DateTimes")

newdata是一个data.frame ,每组DateTimes的Values相加。 然后,inner_join通过DateTimes变量合并在这两个datasets上通用的部分。 由于我不确定您想要的输出是什么,因此对于初学者来说应该是一个很好的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM