es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 rolling dt1[dt2, roll = T] o dt2[dt1, roll = T] ignoraría las claves de dt1 o dt2.
¿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?

Tags:  , , ,

Answer

  1. Avatar for 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 argumento all configurado como TRUE para fusionar las dos tablas de datos en la columna k y luego utilizar la función zoo::na.locf para completar los valores faltantes con la última observación llevada hacia adelante. Aquí está el código:

    library(data.table)
    library(zoo)
    
    dt1 <- data.table(k = 2*(1:4) + 1, v = c(10, 15, 9, 7))
    dt2 <- data.table(k = 2*(1:3), v = c(11, 13, 6))
    
    merged_dt <- merge(dt1, dt2, by = "k", all = TRUE)
    merged_dt[, i.v := na.locf(v.y, na.rm = FALSE)]
    merged_dt[, v := na.locf(v.x, na.rm = FALSE)][, v.x := NULL][, v.y := NULL]
    
    out <- merged_dt[, .SD[1], by = k]
    

    La función merge combina las dos tablas de datos en la columna k y el argumento all = 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 y v.y, que contienen los valores de dt1 y dt2, respectivamente.

    La función na.locf luego completa los valores faltantes en v.y con la última observación llevada hacia adelante. Esto garantiza que siempre tengamos un valor válido para la columna v, incluso si proviene de dt1 o dt2.

    Luego eliminamos las columnas v.x y v.y, y utilizamos by = 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:

    dt <- data.table(k = 1:5, v = c(10, 15, 9, 7, 20), key = "k")
    

    Esto crea una tabla de datos con las columnas k y v, y establece la columna clave en k.

Comments are closed.