R-基于定义的时间间隔(bin)的时间平均值



这是我数据集的示例。我想根据时间(即TS(计算bin平均值每10秒。您能提供一些提示以便我继续吗?

就我而言,我想在每10秒钟内平均时间(TS(和VAR。例如,我将获得从0到10秒的VAR和TS的平均值;我将获得另一个平均值的VAR和TS,从11到20秒,等等。

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

r中的任何功能或库我可以用于此任务吗?

有很多方法可以计算一个平均值:使用base aggregateby,包含包装 dplyrdata.table,可能带有 zoo和其他时间表套件...

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

这是DPLYR方法,请参阅其如何和数据。

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

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

映射到时间(0,10]到10,(10,20]到20(等。

根据答案中的其他一些注释,我指出的是,与使用数据框架相反,这里有很大的简化,首先是因为数据已缩小为一个维度(数据中的2中。框架(,其次,因为它更有利于整个对象方法,而使用数据框架需要不断地分开对象并处理这些部分,而第三,因为现在有人拥有动物园的所有设施来操纵时间序列,例如众多NA删除方案,滚动功能,超载算术运算符,N-Way合并,简单访问经典,晶格和GGPLOT2图形,设计强调与基础R的一致性,可易于学习,并包括5个Vignettes,包括5个Vignettes以及许多示例,包括许多示例鉴于开发和广泛使用的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)

通常,我同意@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.tabledata.frame

只要您只是汇总和分组data.tabledplyr,在性能方面也可能更快。猜猜data.table就速度而言具有比dplyr的优势,但是您将具有基准/配置文件,例如使用microbenchmark。因此,如果您无论如何都不使用经典的R时间序列格式,则没有理由去这些汇总。

最新更新