2012-03-30 17 views
7

diff() calcula la diferencia entre los valores de un vector en un retraso especificado. ¿Hay una función equivalente que funcione en dos vectores? Por ejemplo, tengo:Reemplazo de diff() para columnas múltiples

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

tengo que calcular la diferencia entre cada valor de v1 y v2 en el retardo 1. Eso sería:

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

Esto se puede lograr usando combinaciones de cabeza ()/tails() en los 2 vectores, pero me preguntaba si ya hay una función que puede hacer lo mismo.

Respuesta

9

No hay una función básica que conozca para hacer esto pero como gsk3 señaló que el paquete taRifx tiene esta capacidad. Yo aconsejaría no llamar a un paquete para hacer algo así de simple: Usted podría hacer:

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

O escribir su propia función para el almacenamiento en .Rprofile

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

Eche un vistazo al comando shift en el paquete taRifx.

library(taRifx) 
shift(v1)-v2 

Tendrás que decidir qué quieres hacer con la última entrada (ciclo v1 o simplemente hazlo NA). shift tiene opciones para todas esas posibilidades, así como para cambiar el retraso para ser algo distinto de 1.

2

Si está utilizando un XTS/zoológico objeto de series de tiempo, justo restar la serie quedado:

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

Estoy usando un objeto xts, así que esto es exactamente lo que estaba buscando. Tendré que escribir una pregunta frecuente de xts en algún momento ... :) –

+1

@RobertKubrick: pensé, ya que eres el principal interlocutor de la etiqueta [xts]. Si realmente quieres escribir una pregunta frecuente, con gusto te ayudaré. –

+0

Prepararé un borrador tan pronto como tenga tiempo libre. ¿Cómo puedo enviarle un mensaje personal o un correo electrónico? No veo ninguna información de contacto directo en este sitio web. –

2

la función embed será create cambió de posición en forma de matriz. Si selecciona la primera columna, es el vector no desplazado pero acortado por uno al final y la segunda columna es el vector desplazado y acortado por uno al comienzo.

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 
Cuestiones relacionadas