2011-05-26 62 views
1

我創建值的數組:計算相鄰值的中心在一個數組

binBorder=exp(0:5) 
# 1.000000 2.718282 7.389056 20.085537 54.598150 148.413159 

這使我在這種情況下,長度爲6的陣列。現在我想創建第二個數組,其中包含的數字恰好在兩個數字之間。這應該給的五大小的數組在這種情況下,幷包含值:

1.000000 - (1.000000 - 2.718282)/2 
2.718282 - (2.718282 - 7.389056)/2 
7.389056 - (7.389056 - 20.085537)/2 
20.085537 - (20.085537 - 54.598150)/2 
54.598150 - (54.598150 - 148.413159)/2 

是否有這樣的事情內置的功能?我需要它來計算倉中心(這應該是一個常見問題)。或者,下面的代碼是「最簡單的解決方案」?

> bb1 = exp(0:4) 
> bb2 = exp(1:5) 
> bb = bb1 + ((bb2 - bb1)/2) 
> bb 

我是R的新手,所以我不確定通常如何解決問題。它是更內置的功能還是構建像我構成的解決方案之類的東西?

感謝您的幫助,

斯文

回答

2

您的解決方案可以使用子集,以避免中間變量被改寫:

(binBorder[1:5]+binBorder[-1])/2 
[1] 1.859141 5.053669 13.737297 37.341843 101.505655 

其實,更普遍的,你可以編寫以下功能:

midPoints <- function(x){ 
    (x[-length(x)]+x[-1])/2 
} 
1

功能filter做你所要求的。當以下述方式使用的,它計算2週期均線:

filter(binBorder, c(0.5, 0.5), sides=1) 
Time Series: 
Start = 1 
End = 6 
Frequency = 1 
[1]   NA 1.859141 5.053669 13.737297 37.341843 101.505655 

濾波器的唯一(輕微)的缺點是,它返回ts類(的時間序列)的值。

您可避免通過調用convolve

convolve(binBorder, c(0.5, 0.5), type="filter") 
[1] 1.859141 5.053669 13.737297 37.341843 101.505655 
+0

不錯的答案,但我認爲'convolve'會帶來很多任務的開銷。 – James 2011-05-26 16:05:54

1

這難道不容易被DIFF處理()?

binBorder <- exp(0:5) 
binBorder[1:5] + diff(binBorder)/2