计算数组中相邻值的中心

问题描述

我创建了一个值数组:
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
是否有内置功能可用于此类操作?我需要它来计算垃圾箱中心(这应该是一个常见问题)。还是下面的代码是“最简单的解决方案”?
> bb1 = exp(0:4)
> bb2 = exp(1:5)
> bb = bb1 + ((bb2 - bb1) / 2)
> bb
我是R的新手,所以我不确定一般如何解决问题。它是更多内置函数还是像我组成的解决方案那样构建的东西? 谢谢你的帮助, 斯文     

解决方法

您可以使用子集重写您的解决方案,以避免出现中间变量:
(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
}
    ,
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,type=\"filter\")
[1]   1.859141   5.053669  13.737297  37.341843 101.505655
    ,这不是由diff()轻松处理的吗?
binBorder <- exp(0:5)
binBorder[1:5] + diff(binBorder)/2