我创建了一个值数组:
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的新手,所以我不确定问题是如何解决的。它是更多的内置函数还是像我编写的解决方案那样构建的东西?
感谢您的帮助,
斯文
答案 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