2009-12-11 196 views
1

我決定學習R.我想了解如何編寫「R風格」功能並避免循環。下面是一個示例情況:避免循環在R

給定一個向量a,我想以計算矢量b其元素b[i](矢量索引從1開始)的定義如下:

1 <= i <= 4: 
b[i] = NaN 

5 <= i <= length(a): 
b[i] = mean(a[i-4] to a[i]) 

本質上,如果我們假裝'a'是一個速度列表,其中第一個條目在時間= 0,第二個在時間= 1秒,第三個在時間= 2秒...我想獲得描述平均速度的相應向量,過去5秒鐘。

例如爲: 如果a is (1,1,1,1,1,4,6,3,6,8,9)然後b應該(NaN, NaN, NaN, NaN, 1, 1.6, 2.6, 3, 4, 5.4, 6.4)

我可以用這一個循環做的,但我覺得這樣做會不會在「R風格」。

謝謝

Tungata

回答

3

喜歡的東西b = filter(a, rep(1.0/5, 5), sides=1)將做的工作,雖然你可能會得到零的前幾插槽,而不是NaN的。 R有一個大型的內置函數庫,「R風格」是儘可能使用這些函數。看看filter函數的文檔。

+0

是的,這可能是最簡單可行的移動平均實現 – 2009-12-11 13:01:11

5

由於這些滾動功能往往與時間序列數據,一些較新的,更豐富的時間序列數據處理軟件包的應用已經爲你做的:

R> library(zoo) ## load zoo 
R> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
R> zsp <- zoo(speed, order.by=1:length(speed)) ## creates a zoo object 
R> rollmean(zsp, 5)        ## default use 
    3 4 5 6 7 8 9 
1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> rollmean(zsp, 5, na.pad=TRUE, align="right") ## with padding and aligned 
    1 2 3 4 5 6 7 8 9 10 11 
NA NA NA NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> 

zoo有出色的文檔,將顯示你有很多更多的例子,特別是如何用真實的(也可能是不規則的)日期來做到這一點; xts進一步延伸,但zoo是一個更好的起點。

1

您也可以使用cumsumdiff的組合來獲得滑動窗口的總和。你需要墊用自己的NaN,雖然:

> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
> diff(cumsum(c(0,speed)), 5)/5 
[1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4