【问题标题】:Replacement for diff() for multiple columns替换多列的 diff()
【发布时间】:2012-03-30 15:35:38
【问题描述】:

diff() 计算指定滞后处向量中的值之间的差异。 是否有适用于两个向量的等效函数?例如,我有:

v1 = c(1, 2, 3, 4, 5, 3)
v2 = c(5, 4, 3, 2, 1, 0)

我需要计算滞后 1 时 v1 和 v2 的每个值之间的差异。那将是:

(2 - 5), (3 - 4), (4 - 3)... 

这可以在 2 个向量上使用 head()/tails() 的组合来实现,但我想知道是否已经有一个函数可以做到这一点。

【问题讨论】:

    标签: r diff xts zoo


    【解决方案1】:

    据我所知,没有基本功能可以做到这一点,但正如 gsk3 指出的那样,taRifx 包具有此功能。我建议不要调用一个包来做这么简单的事情:你可以这样做:

    v1[-1] - v2[-length(v2)]
    

    或者在.Rprofile中编写自己的存储函数

    shift.diff <- function(x, y) x[-1] - y[-length(y)]
    shift.diff(v1, v2)
    

    【讨论】:

      【解决方案2】:

      查看taRifx 包中的shift 命令。

      library(taRifx)
      shift(v1)-v2
      

      您必须决定要对最后一个条目做什么(循环 v1 或将其设为 NA)。 shift 具有所有这些可能性的选项,以及将延迟更改为 1 以外的值。

      【讨论】:

        【解决方案3】:

        embed 函数将创建矩阵形式的移位向量。如果您选择第一列,则它是未移位但在末尾缩短了一个向量,第二列是移位并在开始时缩短了一个向量。

        embed(v1,2)[,1] -embed(v2,2)[,2]
        #[1] -3 -1  1  3  2
        
        embed(v1, 2)
             [,1] [,2]
        [1,]    2    1
        [2,]    3    2
        [3,]    4    3
        [4,]    5    4
        [5,]    3    5
        

        【讨论】:

          【解决方案4】:

          如果您使用的是 xts/zoo 时间序列对象,只需减去滞后序列:

          x <- .xts(cbind(v1,v2), 1:length(v1))
          x$v1-lag(x$v2)
          

          【讨论】:

          • 我正在使用一个 xts 对象,所以这正是我想要的。我将不得不在某个时候写一个 xts 常见问题解答...... :)
          • @RobertKubrick:我想,因为您是 [xts] 标签的最高提问者。如果您真的想写一个常见问题解答,我很乐意提供帮助。
          • 我一有空就会准备一份草稿。我如何向您发送个人信息或电子邮件?我在这个网站上没有看到任何直接联系信息。
          • @RobertKubrick:我的联系方式到处都是:about.me 和 TTR 是首先想到的两个。
          猜你喜欢
          • 2011-09-18
          • 2014-02-26
          • 2022-01-22
          • 2021-07-17
          • 1970-01-01
          • 2016-03-29
          • 2016-08-26
          • 2022-01-03
          • 2021-01-05
          相关资源
          最近更新 更多