这是我数据集的示例。我想根据时间(即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 aggregate
, by
,包含包装 dplyr
, data.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)
。
根据答案中的其他一些注释,我指出的是,与使用数据框架相反,这里有很大的简化,首先是因为数据已缩小为一个维度(数据中的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,dplyr
和data.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))]
我不会转到传统的时间序列解决方案,例如ts
,zoo
或xts
。他们的方法更适合处理常规频率和频率,例如每月或季度数据。除ts
外,他们还可以处理不规则的频率和高频数据,但是许多方法(例如打印方法(无法正常工作或最少不会使您优于data.table
或data.frame
。
只要您只是汇总和分组data.table
和dplyr
,在性能方面也可能更快。猜猜data.table
就速度而言具有比dplyr
的优势,但是您将具有基准/配置文件,例如使用microbenchmark
。因此,如果您无论如何都不使用经典的R时间序列格式,则没有理由去这些汇总。