我一直试图在R的设定时间段内平均一些数据,但似乎无法使它正常工作。我采用了一些代码,可以很好地对矩阵进行平均。但是,我正在尝试对过去几周内每10分钟收集的平均相对湿度读数进行平均。
这是我正在尝试使用的当前代码。
boundA <- NULL; boundB <- NULL
for (i in 1:(length(StartAve)))
{
boundA[i] <- max(which(LocalDateTime < StopAve[i]))
boundB[i] <- min(which(LocalDateTime > StartAve[i]))
}
MatMean <- NULL
MatMean <- lapply(matrix,function(z)
{
unlist(lapply(1:(length(boundB)),function(b)
{
mean(z[boundB[b]:boundA[b]],na.rm=TRUE)
}))
})
在这段代码中,我可以读入一个.csv
文件,该文件中包含我希望平均值开始和结束的开始时间和停止时间。我还将读取另一个包含矩阵的文件,并且将基于开始和停止时间对行进行平均。 LocalDateTime
对应于矩阵中每一列的每次收集数据(我可能没有对此很好地解释过)。
就像我之前提到的那样,该代码适用于矩阵中的数据,但是由于我试图对列表中的数据求平均,因此现在不起作用。我希望有人可以帮助我更改/创建代码,以帮助我进行平均。
下面是我所拥有的
LocalDateTime RH
5/24/2018 14:35 77
5/24/2018 14:37 78
5/24/2018 14:38 79
5/24/2018 14:39 78
5/24/2018 14:40 78
5/24/2018 14:41 78
5/24/2018 14:43 78
5/24/2018 14:44 78
5/24/2018 14:45 78
5/24/2018 14:46 79
5/24/2018 14:47 79
5/24/2018 14:49 79
5/24/2018 14:50 79
我要退货的是:
Avg time Avg RH
5/24/2018 14:30-14:40 78
5/24/2018 14:40-14:50 78.5
这些扫描的时间间隔不是固定的,并且偶尔会暂停,因此平均8次扫描的简单代码将不起作用。
答案 0 :(得分:0)
您的预期输出有些不一致。您的“ 40-50”范围平均为78.375(右开)或78.444(右开)。
假设这是一个疏忽:
ldt_range <- seq(
lubridate::floor_date(min(dat$LocalDateTime), "10 minutes"),
lubridate::ceiling_date(max(dat$LocalDateTime), "10 minutes"),
by = 10*60
)
ldt_range
# [1] "2018-05-24 14:30:00 PDT" "2018-05-24 14:40:00 PDT"
# [3] "2018-05-24 14:50:00 PDT"
我使用ldt_range
作为一组垃圾箱。由于我使用floor
和ceiling
,因此可以确保将所有观察值注册到ldt_range
中的至少一个观察值,尽管(如本例所示)最后一个观察值({{1} })本身位于垃圾箱中。
"14:50"
这有点难看,所以我们可以在组号上获得索引ind <- findInterval(dat$LocalDateTime, ldt_range)
res <- aggregate(dat$RH, list(ind), mean)
res
# Group.1 x
# 1 1 78.000
# 2 2 78.375
# 3 3 79.000
:
ldt_range
res$StartTime <- ldt_range[ res$Group.1 ]
res$Group.1 <- NULL
res
# x StartTime
# 1 78.000 2018-05-24 14:30:00
# 2 78.375 2018-05-24 14:40:00
# 3 79.000 2018-05-24 14:50:00