繁体   English   中英

在R中随时间平均

[英]Averaging over time in R

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

您的预期输出有些不一致。 您的“ 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内的至少一个ldt_range ,尽管(如本例所示)最后一个观察值( "14:50" )本身位于一个bin中。

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

数据

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
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')
dat$LocalDateTime <- as.POSIXct(dat$LocalDateTime, format="%m/%d/%Y %H:%M")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM