基于定义的时间间隔(bin)的时间序列平均值

时间:2018-02-17 01:20:34

标签: r time-series mean binning

以下是我的数据集示例。我想基于每10秒的时间(即ts)来计算箱平均值。你能提供一些提示,以便继续吗?

就我而言,我希望每10秒平均一次(ts)和Var。例如,我将得到Var和ts的平均值,从0到10秒;我将得到另一个平均值Var和ts从11秒到20秒等等。

 df = data.frame(ts = seq(1,100,by=0.5), Var = runif(199,1, 10))

我可以使用R中的任何函数或库来执行此任务吗?

3 个答案:

答案 0 :(得分:2)

计算分级平均值的方法有很多种:基数bydplyr,包data.tablezoo,可能包含library(dplyr) df %>% group_by(interval = round(df$ts/10)*10) %>% summarize(Var_mean = mean(Var)) # A tibble: 11 x 2 interval Var_mean <dbl> <dbl> 1 0 4.561653 2 10 6.544980 3 20 6.110336 4 30 4.288523 5 40 5.339249 6 50 6.811147 7 60 6.180795 8 70 4.920476 9 80 5.486937 10 90 5.284871 11 100 5.917074 和肯定是其他时间包...

{{1}}

这就是dplyr方法,看看它和data.table如何命名中间变量,这样可以保持代码清晰易读。

答案 1 :(得分:1)

一般来说,我同意@smci,dplyrdata.table方法在这里是最好的。让我再详细说明一下。

# the dplyr way
library(dplyr)
df %>% 
  group_by(interval = ceiling(seq_along(ts)/20)) %>% 
  summarize(variable_mean = mean(Var))

# the data.table way
library(data.table)
dt <- data.table(df)
dt[,list(Var_mean = mean(Var)),
   by =  list(interval = ceiling(seq_along(dt$ts)/20))]

我不会在这里转到传统的时间序列解决方案,例如tszooxts。他们的方法更适合处理常规频率和频率,如月度或季度数据。除ts之外,它们可以处理不规则频率和高频数据,但许多方法(如打印方法)效果不佳或者至少不会比data.table或{{{{{{ 1}}。

只要您只是聚合和分组,data.framedata.table在性能方面也可能更快。猜测dplyr在速度方面优于data.table,但你会得到基准/配置文件,例如使用dplyr。因此,如果您还没有使用经典的R时间序列格式,那么就没有理由去进行聚合。

答案 2 :(得分:1)

在问题中假设df,转换为动物园对象然后聚合。

aggregate.zoo的第二个参数是一个与时间向量长度相同的向量,给出了每个原始时间要映射到的新时间。第三个参数应用于所有时间序列值,其时间已映射到相同的值。这种映射可以通过各种方式完成,但在这里我们选择使用10 * ceiling(time(z) / 10)将时间(0,10)映射到10,(10,20)到20等。

根据答案中的其他一些评论,让我指出,与使用数据框相比,这里有一个显着的简化,首先是因为数据已减少到一个维度(数据中为2)。框架),其次是因为它更有利于整个对象的方法,而对于数据框架,需要不断地挑选对象并对这些部分进行操作,第三,因为现在有一个动物园的所有设施来操纵时间序列,如众多NA删除方案,滚动函数,重载算术运算符,n路合并,简单访问经典,格子和ggplot2图形,design强调与基础R的一致性,使其易于学习和包括{{3}的大量文档在14年的发展和广泛使用的情况下,有大量的例子和可能很少的错误。

library(zoo)
z <- read.zoo(df)

z10 <- aggregate(z, 10 * ceiling(time(z) / 10), mean)

,并提供:

> z10
      10       20       30       40       50       60       70       80 
5.629926 6.571754 5.519487 5.641534 5.309415 5.793066 4.890348 5.509859 
      90      100 
4.539044 5.480596 

(请注意,问题中的数据不可复制,因为它使用的是没有set.seed的随机数字,因此如果您尝试重复上述内容,则无法获得相同的答案。)

现在我们可以使用以下任何一种来绘制它:

plot(z10)

library(lattice)
xyplot(z10)

library(ggplot2)
autoplot(z10)