计算数组中相邻值的中心

时间:2011-05-26 15:33:28

标签: arrays r vector

我创建了一个值数组:

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

这给了我一个长度为6的数组。现在我想创建第二个数组,其中包含正好在两个数字之间的数字。在这种情况下,这应该给出一个大小为5的数组,并包含值:

 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

这种东西有内置功能吗?我需要它来计算bin中心(这应该是一个常见的问题)。或者以下代码是“最简单的解决方案”?

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

我是R的新手,所以我不确定问题是如何解决的。它是更多的内置函数还是像我编写的解决方案那样构建的东西?

感谢您的帮助,

斯文

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

diff()是不是很容易处理?

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