我有一个不均匀采样的时间序列,我想将其下采样到20Hz。我通过在0.05s时间窗口(20Hz)中对数据点进行分级并对其应用算术平均值来制作移动平均值。数据框如下所示:
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
7 0.059612036 32.01045 50.92879
8 0.076606989 31.80335 50.34975
9 0.082647085 31.18134 49.29151
10 0.090698957 30.35415 48.09110
我用于移动平均线的代码是:
data$group_num <- floor(data$Time/0.05)
data2<-NULL
data2$Right = aggregate(data$Right,
list(group_num=data$group_num), mean)
data2$Left = aggregate(data$Left,
list(group_num=data$group_num), mean)
data2$Time = aggregate(data$Time,
list(group_num=data$group_num), mean)
然而,为了优化它,我想制作一个高斯滤波器,以便bin中间的数据点具有更大的权重。我找不到任何可以处理不均匀采样的函数。因此,我开始写一个脚本,我设法给他们权重。
data$weight <- ((data$Time-data$group_num*0.05)*((data$group_num+1)*0.05-data$Time))^5
我必须通过它们自己的bin中的权重的平均值来规范化这些权重(例如)。通过尝试将这些权重标准化为他们自己组的平均值,我遇到了功能太慢的问题。有人可以帮我一把吗??
答案 0 :(得分:0)
我终于设法做了我想做的事。帮助我克服这个问题的关键功能是ave()。感谢上帝。所以这就是我基本上做的:
data$weight <- (abs(data$Time-(data$group_num*0.05+0.025)))^(-1)
data$Norm<-ave(data$weight,data$group_num,FUN=function(x) x/sum(x))
data$Time2<- data$Time*data$Norm
data$Right2<- data$Right*data$Norm
data$Left2<- data$Left*data$Norm
data2$Time<- tapply(data$Time2, data$group_num, sum)
data2$Right<- tapply(data$Right2, data$group_num, sum)
data2$Left<- tapply(data$Left2, data$group_num, sum)
感谢Marat Talipov的帮助。从我在你的代码中看到的,这也可以工作。但是因为这只是工作得很好而且足够快,所以我会坚持下去。