优化代码以进行下采样

我有一个这样的表,它是flyTracesFiltered.

     Time    Right     Left
1 0.000000000 18.21980 30.98789
2 0.009222031 22.15157 37.18590
3 0.022511959 25.63218 42.49231
4 0.029854059 28.43851 46.57811
5 0.039320946 30.43885 49.29414
6 0.052499056 31.60561 50.67852

我想做的是按时间缩减采样.也就是说,我希望在一定时间内平均所有值以减少样本数量.在我的情况下,我使用0.05秒平均值(20Hz)的平均值.我做的功能看起来像这样:

flyDataDownsampleTime <- function(flyTracesFiltered, samplePeriod) {

  AvgRight<-NULL
  FlyDataRight<-NULL
  AvgLeftt<-NULL
  FlyDataLeft<-NULL
  AvgTime<-NULL
  FlyDataTime<-NULL


  for (i in seq(0,ceiling(max(flyTracesFiltered$Time)),samplePeriod)){

  AvgRight <-mean(flyTracesFiltered$Right[flyTracesFiltered$Time>=i & flyTracesFiltered$Time <= (i+samplePeriod)])  
  FlyDataRight<-c(FlyDataRight,AvgRight)

  AvgLeft <-mean(flyTracesFiltered$Left[flyTracesFiltered$Time>=i & flyTracesFiltered$Time <= (i+samplePeriod)])  
  FlyDataLeft<-c(FlyDataLeft,AvgLeft)

  AvgTime <-mean(flyTracesFiltered$Time[flyTracesFiltered$Time>=i & flyTracesFiltered$Time <= (i+samplePeriod)])  
  FlyDataTime<-c(FlyDataTime,AvgTime)
}
flyTracesDownTime <- data.frame("Time" = FlyDataTime, "Right" = FlyDataRight, "Left" = FlyDataLeft)

return(flyTracesDownTime)
}

我想问一下是否有办法改进这一点,因为大型数据帧需要很长时间.当我需要像这种情况下的迭代时(因为索引),我在实现apply系列函数时遇到了问题.我也读过有关Vectorize函数但我不知道这是否可以使代码更有效.有什么建议?

最佳答案 您可以创建一个新字段,例如group_num

flyTracesFiltered$group_num <- floor(flyTracesFiltered$Time/0.05)

0.05周期是您想要缩短样本的时间空间.在这个领域聚合如下 –

flyTracesFiltered2 = aggregate(flyTracesFiltered$Right,
                     list(group_num=flyTracesFiltered$group_num), mean)

这将为您提供一个新的数据框,其中每个group_num的平均输出值.

您可以对其他列(左)执行相同操作并合并数据框或只添加新列.

点赞