rolling une data.table en R

Estoy tratando de entender un poco más sobre la forma en que las uniones progresivas funcionan y estoy teniendo cierta confusión, esperaba que alguien pudiera aclararme esto. Para tomar un ejemplo concreto:

dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t") dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t") 

data.table esto produjera una larga data.table donde los valores en dt2 son dt2 :

 dt1[dt2,roll=TRUE] 

En cambio, la forma correcta de hacer esto parece ser:

 dt2[dt1,roll=TRUE] 

¿Podría alguien explicarme más acerca de cómo unirse en data.table funciona ya que claramente no lo estoy entendiendo correctamente? Pensé que dt1[dt2,roll=TRUE] correspondía al equivalente en sql de select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t) , excepto con la funcionalidad agregada locf.

Además, la documentación dice:

 X[Y] is a join, looking up X's rows using Y (or Y's key if it has one) as an index. 

Esto hace que parezca que solo deben devolverse las cosas en X y que la unión que se realiza es una unión interna, no externa. ¿Qué pasa en el caso cuando roll=T pero esa id particular no existe en dt1 ? Jugando un poco más, no puedo entender qué valor se está colocando en la columna.

Esa cita de la documentación parece provenir de la pregunta frecuente 1.12. Cuál es la diferencia entre X [Y] y fusión (X, Y) . ¿ ?data.table siguiente en ?data.table y ayuda?

roll Se aplica a la última columna de unión, generalmente una fecha, pero puede ser cualquier variable ordenada, irregular e incluyendo espacios. Si roll = TRUE y la fila i coincide con todas menos la última columna x join, y su valor en la última columna i join cae en un espacio (incluso después de la última observación en x para ese grupo), entonces el valor predominante en x es rodó hacia adelante. Esta operación es particularmente rápida usando una búsqueda binaria modificada. La operación también se conoce como última observación trasladada (LOCF). Por lo general, no debe haber duplicados en la clave de x, la última columna de clave es una fecha (o hora, o fecha y hora) y todas las columnas de la clave de x están unidas. Un modismo común es seleccionar una serie de tiempo regular contemporánea (dts) a través de un conjunto de identificadores (ids): DT [CJ (ids, dts), roll = TRUE] donde DT tiene una clave de 2 columnas (id, date) y CJ significa unión cruzada.

rolltolast Como el rollo, pero los datos no se avanzan más allá de la última observación dentro de cada grupo definido por las columnas de unión. El valor de i debe caer en una brecha en x pero no después del final de los datos, para ese grupo definido por todas menos la última columna de unión. roll y rolltolast pueden no ser ambos VERDADEROS.

En términos de analogías izquierda / derecha con combinaciones de SQL, prefiero pensar en eso en el contexto de la Pregunta frecuente 2.14. ¿Puede explicar con mayor detalle por qué data.table está inspirado en la syntax A [B] en la base ? Esa es una respuesta bastante larga, así que no la pegaré aquí.

    Intereting Posts