[英]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
作为一组垃圾箱。 由于我使用floor
和ceiling
,因此可以确保将每个观察值都注册到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.