Pregunta

muy probablemente expondrá que soy nuevo en R, pero en SPSS, corriendo retardos es muy fácil. Obviamente, esto es un error del usuario, pero lo que me falta?

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

Los resultados en:

      x y
 [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

Me imaginé que iba a ver:

     x y
 [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.

¿Fue útil?

Solución

Otra forma de hacer frente a esto es usar el paquete zoológico, que tiene un método de retardo esa almohadilla voluntad 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)
   x  y
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 de zoo multivariado (que es una matriz mejorada), pero fácilmente convertida a una data.frame vía

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

Otros consejos

Yo tenía el mismo problema, pero no quiero usar zoológico o XTS, así que escribí un simple función para tramas de datos GAL:

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 adelante o hacia atrás:

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, sólo se desplaza la "base de tiempos". x no tiene "base de tiempo", por lo cbind no funciona como se esperaba. Trate cbind(as.ts(x),lag(x)) y el aviso de que un "retraso" de 1 turnos de los períodos hacia adelante .

Me gustaría sugerir el uso de zoo / xts de series de tiempo. Las viñetas zoo son particularmente útiles.

lag() trabaja con series de tiempo, mientras que usted está tratando de utilizar matrices desnudas. Esta vieja pregunta sugiere el uso embed lugar, 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

Uso de las funciones de I simplemente estándar 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

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))
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2

Esto debe 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
}

una forma sencilla de hacer lo mismo se puede copiar los datos a un nuevo dato enmarcar y cambiando el número de índice. Asegúrese de que la tabla original está indexado de forma secuencial sin huecos

por ejemplo.

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

si desea que en la misma trama de datos como el uso original de una función cbind

Dos opciones, en base R y con data.table:

baseShiftBy1 <- function(x) c(NA, x[-length(x)])
baseShiftBy1(x)
[1] NA  3  8  4  8  9  1  5  9  5

data.table::shift(x)
[1] NA  3  8  4  8  9  1  5  9  5   

Datos:

set.seed(123)
(x <- sample(c(1:9), 10, replace = T))
[1] 3 8 4 8 9 1 5 9 5 5

Sólo deshacerse de retraso. Cambiar su línea para y a:

y <- c(NA, x[-1])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top