优化下采样代码
Optimizing the code for downsampling
我有一个这样的table,就是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)
}
我想问一下是否有办法改进这一点,因为大型数据帧需要很长时间。当我在这种情况下需要迭代时(由于索引),我在实现应用族函数时遇到了问题。我还阅读了 Vectorize 函数,但我不知道这是否可以使代码更有效。有什么建议吗?
您可以创建一个新字段,例如,group_num
flyTracesFiltered$group_num <- floor(flyTracesFiltered$Time/0.05)
其中 0.05 周期是时间-space 您想要将样本缩短到。聚合此字段,例如 -
flyTracesFiltered2 = aggregate(flyTracesFiltered$Right,
list(group_num=flyTracesFiltered$group_num), mean)
这将为您提供一个新数据框,每个数据框的平均值为 group_num。
您可以对其他列(左)执行相同操作并合并数据框或只添加新列。
我有一个这样的table,就是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)
}
我想问一下是否有办法改进这一点,因为大型数据帧需要很长时间。当我在这种情况下需要迭代时(由于索引),我在实现应用族函数时遇到了问题。我还阅读了 Vectorize 函数,但我不知道这是否可以使代码更有效。有什么建议吗?
您可以创建一个新字段,例如,group_num
flyTracesFiltered$group_num <- floor(flyTracesFiltered$Time/0.05)
其中 0.05 周期是时间-space 您想要将样本缩短到。聚合此字段,例如 -
flyTracesFiltered2 = aggregate(flyTracesFiltered$Right,
list(group_num=flyTracesFiltered$group_num), mean)
这将为您提供一个新数据框,每个数据框的平均值为 group_num。
您可以对其他列(左)执行相同操作并合并数据框或只添加新列。