【问题标题】:Averaging over time in R在 R 中随时间平均
【发布时间】:2018-07-14 02:35:14
【问题描述】:

我一直在尝试在 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 次扫描的简单代码将无法正常工作。

【问题讨论】:

    标签: r time mean


    【解决方案1】:

    您的预期输出有点不一致。您的“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 中的至少一个,尽管(如本例所示)最后一个观察("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
    

    数据

    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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-12
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多