Lag básico en el vector R / dataframe

Lo más probable es que exponga que soy nuevo en R, pero en SPSS, los rezagos de ejecución son muy fáciles. Obviamente, este es un error del usuario, pero ¿qué me falta?

x <- sample(c(1:9), 10, replace = T) y <- lag(x, 1) ds <- cbind(x, y) ds 

Resultados en:

  xy [1,] 4 4 [2,] 6 6 [3,] 3 3 [4,] 4 4 [5,] 3 3 [6,] 5 5 [7,] 8 8 [8,] 9 9 [9,] 3 3 [10,] 7 7 

Pensé que vería:

  xy [1,] 4 [2,] 6 4 [3,] 3 6 [4,] 4 3 [5,] 3 4 [6,] 5 3 [7,] 8 5 [8,] 9 8 [9,] 3 9 [10,] 7 3 

Cualquier orientación será muy apreciada.

Otra forma de lidiar con esto es usar el paquete del zoológico, que tiene un método de retraso que rellenará el resultado con NA:

 require(zoo) > set.seed(123) > x <- zoo(sample(c(1:9), 10, replace = T)) > y <- lag(x, -1, na.pad = TRUE) > cbind(x, y) xy 1 3 NA 2 8 3 3 4 8 4 8 4 5 9 8 6 1 9 7 5 1 8 9 5 9 5 9 10 5 5 

El resultado es un objeto zoo multivariable (que es una matriz mejorada), pero se convierte fácilmente en una estructura de data.frame

 > data.frame(cbind(x, y)) 

Tuve el mismo problema, pero no quería usar zoo o xts, así que escribí una función de retardo simple para marcos de datos :

 lagpad <- function(x, k) { if (k>0) { return (c(rep(NA, k), x)[1 : length(x)] ); } else { return (c(x[(-k+1) : length(x)], rep(NA, -k))); } } 

Esto puede retrasarse o retroceder:

 x<-1:3; (cbind(x, lagpad(x, 1), lagpad(x,-1))) x [1,] 1 NA 2 [2,] 2 1 3 [3,] 3 2 NA 

lag no cambia los datos, solo cambia la “base de tiempo”. x no tiene “base de tiempo”, por lo que cbind no funciona como esperaba. Pruebe cbind(as.ts(x),lag(x)) y observe que un “retraso” de 1 desplaza los períodos hacia adelante .

xts usar zoo / xts para series temporales. Las viñetas del zoo son particularmente útiles.

lag() funciona con series de tiempo, mientras que usted está tratando de usar matrices desnudas. Esta vieja pregunta sugiere usar embed , así:

 lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1) 

por ejemplo

 > x [1] 8 2 3 9 8 5 6 8 5 8 > lagmatrix(x, 1) [,1] [,2] [1,] 8 NA [2,] 2 8 [3,] 3 2 [4,] 9 3 [5,] 8 9 [6,] 5 8 [7,] 6 5 [8,] 8 6 [9,] 5 8 [10,] 8 5 

Usando solo las funciones estándar R esto se puede lograr de una manera mucho más simple:

 x <- sample(c(1:9), 10, replace = T) y <- c(NA, head(x, -1)) ds <- cbind(x, y) ds 
 tmp<-rnorm(10) tmp2<-c(NA,tmp[1:length(tmp)-1]) tmp tmp2 

Esto debería acomodar vectores o matrices, así como retardos negativos:

 lagpad <- function(x, k=1) { i<-is.vector(x) if(is.vector(x)) x<-matrix(x) else x<-matrix(x,nrow(x)) if(k>0) { x <- rbind(matrix(rep(NA, k*ncol(x)),ncol=ncol(x)), matrix(x[1:(nrow(x)-k),], ncol=ncol(x))) } else { x <- rbind(matrix(x[(-k+1):(nrow(x)),], ncol=ncol(x)),matrix(rep(NA, -k*ncol(x)),ncol=ncol(x))) } if(i) x[1:length(x)] else x } 

Solo deshazte del retraso. Cambia tu línea por y para:

 y <- c(NA, x[-1]) 

La forma más fácil para mí ahora parece ser la siguiente:

 require(dplyr) df <- data.frame(x = sample(c(1:9), 10, replace = T)) df <- df %>% mutate(y = lag(x)) 

una forma simple de hacer lo mismo puede ser copiar los datos a un nuevo dataframe y cambiar el número de índice. Asegúrese de que la tabla original esté indexada secuencialmente sin espacios vacíos

p.ej

 tempData <- originalData rownames(tempData) <- 2:(nrow(tempData)+1) 

si lo quiere en el mismo dataframe que el original use una función cbind