我有一个data.frame,它有多列。其中一列是时间,因此不会减少。其余列包含在data.frame的某一行中指定的时间内记录的观察结果。
我想选择一个时间窗口,比如“x”秒,并计算该窗口的同一data.frame中某些其他列中条目的平均值(或者就此而言任何函数)。
当然,因为它是基于时间的平均值,所以窗口中的条目数可以根据数据而变化。这是因为属于特定时间窗口的行数可能会有所不同。
我使用自定义函数完成此操作,该函数在data.frame中创建一个新列。新列为时间窗口中的所有条目分配单个数字。该编号在所有时间窗口中都是唯一的。这实际上基于时间窗口将数据分成组。然后我使用R的“聚合”函数来计算平均值。
我只是想知道是否存在可以根据时间间隔进行分组的现有R函数,或者是否有更好(更干净)的方法来执行此操作。
答案 0 :(得分:4)
假设您的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秒为间隔分组,以秒= 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
答案 1 :(得分:0)
zoo有一个rollapply()
方法。如果您不能使用它,我已经滚动了几次。这不是很困难。