【问题标题】:Time-based averaging (sliding window) of columns in a data.framedata.frame 中列的基于时间的平均(滑动窗口)
【发布时间】:2011-04-28 04:55:59
【问题描述】:

我有一个包含多列的 data.frame。其中一列是时间,因此是非递减的。其余列包含在 data.frame 的某一行中指定的时间给定的时间记录的观察结果。

我想选择一个时间窗口,例如“x”秒,然后计算该窗口的同一 data.frame 中的其他一些列中条目的平均值(或任何函数)。

当然,由于它是基于时间的平均值,因此窗口中的条目数可能会因数据而异。这是因为属于某个时间窗口的行数可能会有所不同。

我使用自定义函数完成了这项工作,该函数在 data.frame 中创建了一个新列。新列为时间窗口中的所有条目分配一个编号。该数字在所有时间窗口中都是唯一的。这实质上是根据时间窗口将数据分组。然后我使用 R 的“聚合”函数来计算平均值。

我只是想知道是否存在可以根据时间间隔进行分组的现有 R 函数,或者是否有更好(更清洁)的方法来做到这一点。

【问题讨论】:

  • 能否提供一些示例数据?最佳解决方案将取决于您的数据是什么样的。
  • 我想知道这是否可能,因为我自己做,但它非常消耗 CPU,所以我不知道也许我必须将窗口设置为更大的值,无论如何 TY ;)

标签: r dataframe


【解决方案1】:

zoo 有一个rollapply() 方法。如果你不能使用它,我已经自己滚动了几次。难度不大。

【讨论】:

    【解决方案2】:

    假设您的 data.frame 仅包含数字数据,这是使用 zoo/xts 的一种方法:

    > Data <- data.frame(Time=Sys.time()+1:20,x=rnorm(20))
    > xData <- xts(Data[,-1], Data[,1])
    > period.apply(xData, endpoints(xData, "seconds", 5), colMeans)
                               [,1]
    2010-10-20 13:34:19 -0.20725660
    2010-10-20 13:34:24 -0.01219346
    2010-10-20 13:34:29 -0.70717312
    2010-10-20 13:34:34  0.09338097
    2010-10-20 13:34:38 -0.22330363
    

    编辑:仅使用基本 R 包。均值相同,但时间略有不同,因为endpoints 以第一次观察开始 5 秒间隔。下面的代码以 5 秒为间隔分组,从 seconds = 0 开始。

    > nSeconds <- 5
    > agg <- aggregate(Data[,-1], by=list(as.numeric(Data$Time) %/% nSeconds), mean)
    > agg[,1] <- .POSIXct(agg[,1]*nSeconds)  # >= R-2.12.0 required for .POSIXct
    

    【讨论】:

    • 感谢您的回答,这是正确的,但我仍然对其他人如何使用 R 解决它感兴趣
    • 但这使用 R... 还是您正在寻找仅使用基本 R 包的解决方案?
    • 是的,使用 base R 或至少保留了 data.frame 类型,尽管我检查了我可以在 xts 上使用 as.data.frame 将其转换回来,唯一的事情是我会拥有使用 row.names (时间信息)显式添加另一列,以便使用 ggplot2 创建图形
    • 感谢您的解决方案,正是我想要的
    • @Ken:您可以将rollapply 用于滑动窗口,但窗口基于观察次数,而不是特定时间间隔。对于不规则的时间序列,这可能是个问题。
    猜你喜欢
    • 2023-03-23
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2017-03-12
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多