2011-04-04 20 views
6

Digamos que tengo una trama de datos con la siguiente estructura:R: crear una trama de datos de una ventana de rodadura

DF <- data.frame(x = 0:4, y = 5:9) 
> DF 
    x y 
1 0 5 
2 1 6 
3 2 7 
4 3 8 
5 4 9 

¿cuál es la forma más eficiente para convertir 'DF' en una trama de datos con el estructura siguiente:

w x y 
1 0 5 
1 1 6 
2 1 6 
2 2 7 
3 2 7 
3 3 8 
4 3 8 
4 4 9 

Donde w es una ventana de longitud 2 que rueda a través del marco de datos 'DF'. La longitud de la ventana debe ser arbitraria, es decir, una longitud de 3 rendimientos

w x y 
1 0 5 
1 1 6 
1 2 7 
2 1 6 
2 2 7 
2 3 8 
3 2 7 
3 3 8 
3 4 9 

estoy un poco stumped por este problema, debido a que la trama de datos también puede contener un número arbitrario de columnas, es decir, w, x, y , z, etc.

/editar 2: me he dado cuenta de edición 1 es un poco razonable, ya que no parece XTS para hacer frente a múltiples observaciones por punto de datos

Respuesta

8

Mi enfoque sería utilizar la función embed . Lo primero que debe hacer es crear una secuencia de índices en un vector. Tome una estructura de datos:

df <- data.frame(x = 0:4, y = 5:9) 

nr <- nrow(df) 
w <- 3   # window size 
i <- 1:nr   # indices of the rows 
iw <- embed(i,w)[, w:1] # matrix of rolling-window indices of length w 

> iw 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 3 4 
[3,] 3 4 5 

wnum <- rep(1:nrow(iw),each=w) # window number 
inds <- i[c(t(iw))]    # the indices flattened, to use below 

dfw <- sapply(df, '[', inds) 
dfw <- transform(data.frame(dfw), w = wnum) 

> dfw 
    x y w 
1 0 5 1 
2 1 6 1 
3 2 7 1 
4 1 6 2 
5 2 7 2 
6 3 8 2 
7 2 7 3 
8 3 8 3 
9 4 9 3 
+0

+1 muy buen uso de embed() –

Cuestiones relacionadas