我有一个data.frame有多列.其中一列是时间,因此不会减少.其余列包含在data.frame的某一行中指定的时间给出的时间记录的观察值.
我想选择一个时间窗口,比如"x"秒,并计算该窗口的同一data.frame中某些其他列中条目的平均值(或者就此而言任何函数).
当然,因为它是基于时间的平均值,所以窗口中的条目数可以根据数据而变化.这是因为属于特定时间窗口的行数可以变化.
我使用自定义函数完成了这项工作,该函数在data.frame中创建了一个新列.新列为时间窗口中的所有条目分配单个数字.该编号在所有时间窗口中都是唯一的.这实际上基于时间窗口将数据分成组.然后我使用R的"聚合"函数来计算平均值.
我只是想知道是否存在可以根据时间间隔进行分组的现有R函数,或者是否有更好(更干净)的方法来执行此操作.
假设您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
Run Code Online (Sandbox Code Playgroud)
编辑:仅使用基本 R 包。均值相同,但时间略有不同,因为endpoints5 秒间隔从第一次观察开始。下面的代码以秒 = 0 开始,以 5 秒为间隔进行分组。
> 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
Run Code Online (Sandbox Code Playgroud)