在R中随时间平均

时间:2018-07-13 18:19:40

标签: r time mean

我一直试图在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次扫描的简单代码将不起作用。

1 个答案:

答案 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作为一组垃圾箱。由于我使用floorceiling,因此可以确保将所有观察值注册到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