【问题标题】:Calculate the center of adjacent values in an array计算数组中相邻值的中心
【发布时间】:2011-09-02 17:25:19
【问题描述】:

我创建了一个值数组:

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 的新手,所以我不确定问题通常是如何解决的。是更多的内置函数还是像我编写的解决方案那样构建东西?

感谢您的帮助,

斯文

【问题讨论】:

    标签: arrays r vector


    【解决方案1】:

    这不是很容易被 diff() 处理的吗?

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

    【讨论】:

      【解决方案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, c(0.5, 0.5), type="filter")
      [1]   1.859141   5.053669  13.737297  37.341843 101.505655
      

      【讨论】:

      • 不错的答案,但我认为convolve 会为这项任务带来很多开销。
      【解决方案3】:

      您的解决方案可以使用子集重写以避免中间变量:

      (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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 2019-07-23
        相关资源
        最近更新 更多