Замена для diff () для нескольких столбцов - PullRequest
7 голосов
/ 30 марта 2012

diff () вычисляет разницу между значениями в векторе с заданной задержкой. Есть ли эквивалентная функция, которая работает на двух векторах? Например, у меня есть:

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

Мне нужно рассчитать разницу между каждым значением v1 и v2 при лаге 1. Это будет:

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

Этого можно достичь, используя комбинации head () / tails () на 2 векторах, но мне было интересно, есть ли уже функция, которая может делать то же самое.

Ответы [ 4 ]

9 голосов
/ 30 марта 2012

Я не знаю базовой функции для этого, но, как указал gsk3, пакет taRifx обладает такой возможностью.Я бы не советовал вызывать пакет, чтобы сделать что-то такое простое: вы можете сделать:

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

или написать свою собственную функцию для хранения в .Rprofile

shift.diff <- function(x, y) x[-1] - y[-length(y)]
shift.diff(v1, v2)
4 голосов
/ 30 марта 2012

Посмотрите на команду shift в пакете * 1002. *

library(taRifx)
shift(v1)-v2

Вам нужно решить, что вы хотите сделать с последней записью (цикл v1 или просто сделать этоНС).shift имеет опции для всех этих возможностей, а также для изменения лага на что-то отличное от 1.

2 голосов
/ 30 марта 2012

Функция 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
2 голосов
/ 30 марта 2012

Если вы используете объект временного ряда xts / zoo, просто вычтите отсроченный ряд:

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