以下是我的数据集示例。我想基于每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中的任何函数或库来执行此任务吗?
答案 0 :(得分:2)
计算分级平均值的方法有很多种:基数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
和肯定是其他时间包...
{{1}}
这就是dplyr方法,看看它和data.table如何命名中间变量,这样可以保持代码清晰易读。
答案 1 :(得分:1)
一般来说,我同意@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
或{{{{{{ 1}}。
只要您只是聚合和分组,data.frame
和data.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)