unir dos series temporales en data.table mediante la función de “rolling join”
Supongamos que tenemos dos series de tiempo asincrónicas en data.table
:
dt1 = setkey(data.table(k = 2(1:4) + 1, v = c(10, 15, 9, 7)), k)
dt2 = setkey(data.table(k = 2(1:3), v = c(11, 13, 6)), k)
Mi resultado deseado es fusionarlos en la columna k
usando LOCF y todos los valores de k
de dt1
y dt2
, de la siguiente manera:
out
k v i.v
2 NA 11
3 10 11
4 10 13
5 15 13
6 15 6
7 9 6
9 7 6
Actualmente, estoy usando una construcción un tanto torpe:
all_keys = setkey(data.table(k = sort(c(dt1[, k], dt2[, k])), k)
dt1[all_keys, roll = T, on = 'k'][
dt2[all_keys, roll = T, on = 'k']]
Esto funciona, pero parece un poco forzado. Tenga en cuenta que un simple rollingdt1[dt2, roll = T]
odt2[dt1, roll = T]
ignoraría las claves dedt1
odt2
.
¿Hay una forma más sencilla?
P.D. Nota adicional – ¿hay también una forma más sencilla de crear un data.table
con clave desde el principio solo usando la función data.table
, sin seguir con un setkey?
davy.ai
Sí, hay una forma más sencilla de fusionar las dos series de tiempo utilizando LOCF y todos los valores de k de dt1 y dt2.
Puede utilizar la función
merge
en data.table con el argumentoall
configurado comoTRUE
para fusionar las dos tablas de datos en la columna k y luego utilizar la funciónzoo::na.locf
para completar los valores faltantes con la última observación llevada hacia adelante. Aquí está el código:La función
merge
combina las dos tablas de datos en la columna k y el argumentoall = TRUE
asegura que se incluyan todos los valores de k de ambas tablas. La tabla de datos fusionada resultante tiene dos columnas para v,v.x
yv.y
, que contienen los valores de dt1 y dt2, respectivamente.La función
na.locf
luego completa los valores faltantes env.y
con la última observación llevada hacia adelante. Esto garantiza que siempre tengamos un valor válido para la columnav
, incluso si proviene de dt1 o dt2.Luego eliminamos las columnas
v.x
yv.y
, y utilizamosby = k
y.SD[1]
para mantener solo la primera fila para cada valor de k. Esto asegura que tengamos exactamente una fila para cada valor de k, como se requiere en la salida deseada.Para crear una tabla de datos con clave desde el principio utilizando la función data.table, puede utilizar el argumento
key
para establecer las columnas clave. Aquí hay un ejemplo:Esto crea una tabla de datos con las columnas k y v, y establece la columna clave en k.