Hay varias formas de obtener una variable retrasada dentro de un grupo. En primer lugar, debe ordenar los datos, de modo que en cada grupo el tiempo se ordene en consecuencia.
Primero, creemos un data.frame de muestra:
> set.seed(13)
> dt <- data.frame(location = rep(letters[1:2], each = 4), time = rep(1:4, 2), var = rnorm(8))
> dt
location time var
1 a 1 0.5543269
2 a 2 -0.2802719
3 a 3 1.7751634
4 a 4 0.1873201
5 b 1 1.1425261
6 b 2 0.4155261
7 b 3 1.2295066
8 b 4 0.2366797
Defina nuestra función de retraso:
lg <- function(x)c(NA, x[1:(length(x)-1)])
Luego, el retraso de la variable dentro del grupo se puede calcular usando tapply
:
> unlist(tapply(dt$var, dt$location, lg))
a1 a2 a3 a4 b1 b2 b3 b4
NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066
Usando el ddply
paquete plyr :
> ddply(dt, ~location, transform, lvar = lg(var))
location time var lvar
1 a 1 -0.1307015 NA
2 a 2 -0.6365957 -0.1307015
3 a 3 -0.6417577 -0.6365957
4 a 4 -1.5191950 -0.6417577
5 b 1 -1.6281638 NA
6 b 2 0.8748671 -1.6281638
7 b 3 -1.3343222 0.8748671
8 b 4 1.5431753 -1.3343222
Versión más rápida usando data.table
desde el paquete data.table
> ddt <- data.table(dt)
> ddt[,lvar := lg(var), by = c("location")]
location time var lvar
[1,] a 1 -0.1307015 NA
[2,] a 2 -0.6365957 -0.1307015
[3,] a 3 -0.6417577 -0.6365957
[4,] a 4 -1.5191950 -0.6417577
[5,] b 1 -1.6281638 NA
[6,] b 2 0.8748671 -1.6281638
[7,] b 3 -1.3343222 0.8748671
[8,] b 4 1.5431753 -1.3343222
Usando la lag
función del paquete plm
> pdt <- pdata.frame(dt)
> lag(pdt$var)
a-1 a-2 a-3 a-4 b-1 b-2 b-3 b-4
NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066
Usando la lag
función del paquete dplyr
> dt %>% group_by(location) %>% mutate(lvar = lag(var))
Source: local data frame [8 x 4]
Groups: location
location time var lvar
1 a 1 0.5543269 NA
2 a 2 -0.2802719 0.5543269
3 a 3 1.7751634 -0.2802719
4 a 4 0.1873201 1.7751634
5 b 1 1.1425261 NA
6 b 2 0.4155261 1.1425261
7 b 3 1.2295066 0.4155261
8 b 4 0.2366797 1.2295066
Los dos últimos enfoques requieren la conversión de data.frame
a otro objeto, aunque no es necesario preocuparse por la clasificación. Mi preferencia personal es la última, que no estaba disponible al escribir la respuesta inicialmente.
Actualización: se modificó el código data.table para reflejar los desarrollos del paquete data.table, señalado por @Hibernating.
Actualización 2: ejemplo de dplyr agregado .
@ mpiktas Solo para mencionar brevemente dos pequeños descuidos en la versión 3 de su respuesta. En primer lugar, la frase "versión más rápida" claramente se ha dejado por error. En segundo lugar, la palabra ": =" se ha perdido en el código. Arreglar el último arregla el primero: =)
fuente
En lugar de seguir todos los
tapply
pasos adicionales, aquí hay una forma más rápida:fuente
Con dplyr
fuente
Es posible que desee ver el
vars
paquete. Suena como un vector de autorregresión (VAR) es lo que puede estar tratando de hacer.fuente
Con DataCombine:
Los datos también deben ordenarse. Use en
slideBy=-1
cambio para retrasos.fuente