2016-01-22 54 views
0

我有一個不均勻採樣的時間序列,我想將它降頻採樣到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) 

然而,對於優化它,我想打,而高斯濾波器,從而使數據垃圾桶中點的重量更重。我無法找到任何可以處理不均勻採樣的功能。因此,我開始寫一個腳本,在那裏我設法給他們權重。

data$weight <- ((data$Time-data$group_num*0.05)*((data$group_num+1)*0.05-data$Time))^5 

我必須通過在他們自己的bin(例如)權重的平均值來規範這些權重。通過將這些權重歸一化到他們自己的組的平均值,我遇到了功能太慢的問題。有誰能幫我一把嗎?

+0

我建議看看'動物園'包的'rollmean'和'rollapply'功能 –

+0

如果我理解正確,這些函數可用於裝箱的固定數量的數據點。這就是我迄今看到的每個功能的工作原理。但是,因爲我的採樣不均勻,所以我根據時間窗口對它們進行了處理,其中一些數據點有3個數據點,其他4個或5個或6個。...... – chiser

+0

好吧,那麼'data.table'是否會成爲您的選項? –

回答

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的幫助。從我在代碼中看到的情況來看,這也可以起作用。但是,因爲這只是工作得很好,而且速度夠快,所以我會保持這種狀態。