替换多列的diff()

时间:2012-03-30 15:35:39

标签: r diff xts zoo

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()的组合来实现,但我想知道是否已经存在可以执行相同操作的函数。

4 个答案:

答案 0 :(得分:9)

我知道没有基本功能,但gsk3指出taRifx包具有此功能。我建议不要打电话给一个包来做一些简单的事情:你可以这样做:

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

或者在.Rprofile中编写自己的存储功能

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

答案 1 :(得分:4)

查看shift包中的taRifx命令。

library(taRifx)
shift(v1)-v2

您必须决定要对最后一个条目执行什么操作(循环v1或只是将其设为NA)。 shift可以选择所有这些可能性,以及将滞后更改为1以外的其他内容。

答案 2 :(得分:2)

如果你正在使用xts / zoo时间序列对象,只需减去滞后系列:

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

答案 3 :(得分:2)

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