Cómo usar la función Dif/Lag por grupo de columnas<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola gente de la comunidad JMP,
Tengo una tabla de datos con cuatro columnas como Box, iClass, BinPos y Slot.iClass significa 24 niveles de productos, BinPos significa la ubicación de la caja en el equipo de clasificación y Slot indica en qué posición de ranura se colocará el producto en la caja. La caja está diseñada para contener una cantidad máxima de 100 productos, después de lo cual se colocaría una nueva caja vacía. Para verificar que el producto se coloque en el cuadro correcto y que el incremento de la ranura sea exactamente "1" (porque en algún momento observé manualmente que el incremento de la ranura aumentó> 1 o incremento = 0, lo que significaba que la máquina de colocación tenía problemas), traté de usar la función dif/lag para verificar el incremento. Sin embargo, la fórmula dif/lag no me permite agregar una función para agrupar por columna de Box. El cuadro es en realidad el identificador único.
Una fórmula como Dif(:Slot,1) puede decirme la diferencia b/wa cierta con respecto a la fila anterior. Sin embargo, las filas se mezclan con diferentes cajas debido a que el nivel de diferencia del producto pertenece a la columna iClass.
Espero tener una fórmula como Dif(:Slot, 1, :Box) para trabajar. ¿Algún experto puede dar algunas pistas para resolver esto? Se adjunta una tabla de ejemplo para su investigación.
Muchas gracias de antemano
| Caja | iclase | BinPos | Ranura |
| 72813_2 | 11 | 11 | 64 |
| 73213_2 | 15 | 15 | 2 |
| 73213_2 | 15 | 15 | 3 |
| 73213_2 | 15 | 15 | 4 |
| 73213_2 | 15 | 15 | 5 |
| 73213_2 | 15 | 15 | 6 |
| 73213_2 | 15 | 15 | 7 |
| 73213_2 | 15 | 15 | 8 |
| 73214_2 | 14 | 14 | 1 |
| 73214_2 | 14 | 14 | 2 |
| 73214_2 | 14 | 14 | 3 |
| 73214_2 | 14 | 14 | 4 |
| 73214_2 | 14 | 14 | 5 |
| 73214_2 | 14 | 14 | 6 |
| 73213_2 | 15 | 15 | 9 |
| 73214_2 | 14 | 14 | 7 |
| 73213_2 | 15 | 15 | 10 |
| 73213_2 | 15 | 15 | 11 |
| 73213_2 | 15 | 15 | 12 |
| 73213_2 | 15 | 15 | 13 |
| 73213_2 | 15 | 15 | 14 |
| 73213_2 | 15 | 15 | 15 |
| 73214_2 | 14 | 14 | 8 |
Re: Cómo usar la función Dif/Lag por grupo de columnasAquí hay una reelaboración de la fórmula anterior.Esta fórmula funciona con JMP 14
If( Row() == 1,
dt = Current Data Table()
);
i = Row();
holdBox = :Box;
allrows = dt << get rows where( holdBox == :Box[i] );
If( Loc( As List( allrows ), i )[1] == 1,
1,
:Slot[allrows[Loc( As List( allrows ), i )[1]]] - :Slot[allrows[Loc( As List( allrows ), i )[1] - 1]]
);
Re: Cómo usar la función Dif/Lag por grupo de columnasAquí hay un pequeño script que debería darle los resultados que desea para la fecha de eliminación
Names Default To Here( 1 );
dt = Current Data Table();
// Add a sequence column to capture the current
// order of the data table
dt << New Column( "tableorder", formula( Row() ) );
// Convert the values in the tableorder column to real values
dt:tableorder << delete formula;
// Sort the table in ascending order
dt = dt << Sort(
By( :Tool, :Part, :Install Date ),
Order( Ascending, Ascending, Ascending ),
replace table( 1 )
);
// Create the Remove Date Column
dt << New Column( "Remove Date", Format( "m/d/y", 10 ) );
// Loop across all of the rows and set the Remove Date
For( i = 2, i <= N Rows( dt ), i++,
If( :Tool[i] == :Tool[i - 1] & :Part[i] == :Part[i - 1],
:Remove Date[i - 1] = :install Date[i]
)
);
// Sort the table back to original order
dt = dt << Sort( By( :tableorder ), Order( Ascending ), replace table( 1 ) );
// Remove the tableorder column
dt << delete columns( "tableorder" );
Re: Cómo usar la función Dif/Lag por grupo de columnasJim,
Lo retiro: la fórmula no funcionaba porque no conocía la expresión Obtener filas dónde. Tan pronto como cambié el tipo de columna (era una fecha, así que realmente no me importaba) a Numérico, funcionó, aunque todavía no le gusta Obtener filas dónde.
Básicamente, lo que estoy tratando de hacer es encontrar la fecha anterior por Columna.
Tengo una tabla de historial de reemplazo de piezas en diferentes herramientas:
| Herramienta | Parte | Fecha de instalación | Quitar fecha |
| Herramienta A | Parte 1 | 03/03/2015 | ??? |
| Herramienta B | Parte 1 | 04/04/2015 | ??? |
| Herramienta A | Parte 2 | 05/05/2015 | ??? |
| Herramienta A | Parte 1 | 06/06/2015 | ??? |
| Herramienta A | Parte 2 | 07/07/2015 | ??? |
| | | | |
Entonces, para la misma herramienta y la misma pieza, necesito obtener la PRÓXIMA fecha de instalación y ponerla como Fecha de eliminación para la pieza actual.
Ahora, no estoy seguro de cómo se asegura de que realmente busque la fecha SIGUIENTE. La fórmula funciona con las modificaciones mínimas que puedo ver en las observaciones limitadas, pero hasta donde yo entiendo la fórmula, no sería...
¿Podría ayudarme con la limpieza de esto?
Gracias,
METRO.
Re: Cómo usar la función Dif/Lag por grupo de columnasJim,
Esta es una solución muy valiosa ya que proporciona una funcionalidad de una fórmula inexistente ColLag(); 
Sin embargo, veo que ha pasado bastante tiempo desde que publicaste esta solución. A JMP 14 hoy en día no le gusta cómo está escrito. Dice Get Rows Where is a unknown function y dice que el uso de Current Data Table() en fórmulas no es estable.
¿Hay alguna versión más nueva de esta solución?
Gracias,
METRO.
Re: Cómo usar la función Dif/Lag por grupo de columnasSi necesita más precisión en el tiempo, @msharp señaló en una publicación reciente:
Today() solo tiene una precisión de segundos, Tick Seconds() tiene una precisión de 1/60 de segundo y HP TIME() tiene una precisión de microsegundos.
Re: Cómo usar la función Dif/Lag por grupo de columnasCon tantas filas, usar el método de clasificación sería más rápido.A continuación se muestra el método que utilizo para encontrar el tiempo que tarda un script:
inicio = hoy();
el guión o parte de un guión en el que desea encontrar los tiempos
mostrar (hoy () - inicio);
Re: Cómo usar la función Dif/Lag por grupo de columnasHola Jim,
Gracias por la ayuda. En realidad, tengo más de 60 000 filas en una sola tabla diaria. Si ejecuto una fórmula que me proporciona, tomaría bastante tiempo.
¿Sería más rápido si ordeno los datos primero y luego ejecuto la fórmula?
Por cierto, ¿hay alguna forma de que jmp cuente el tiempo que se ejecuta para un script o una fórmula?
Saludos,
Re: Cómo usar la función Dif/Lag por grupo de columnasEl ejemplo es una fórmula para una nueva tabla, no un script JSL independiente.Cree una nueva columna y pegue la fórmula en la fórmula de la columna, y generará los valores incrementales que desee.



Re: Cómo usar la función Dif/Lag por grupo de columnasHola Jim,
Intenté ejecutar la secuencia de comandos que creó (simplemente copie y pegue la secuencia de comandos completa), sin embargo, no puedo ver ningún cambio en la tabla de datos ni una nueva columna para generar.
Traté de hacer una nueva columna con su script pero tampoco funcionó.
Esto es lo que el script que traté de ejecutar,
i = Fila();
allrows = Tabla de datos actual() << obtener filas donde( :Box_ID == :Box_ID );
allrows<< Nueva columna("Prueba", Numérico, Continuo, Fórmula(If( Loc( As List( allrows ), i )[1] == 1,
1,
ranura[todas las filas[Loc( Como lista( todas las filas ), i )[1]]] - ranura[todas las filas[(Loc( Como lista( todas las filas ), i )[1])-1]]
)));
Saludos,
Re: Cómo usar la función Dif/Lag por grupo de columnasSi el orden absoluto de los datos originales no es importante, la clasificación de los datos y el uso de la función Dif funcionarán.Sin embargo, aquí hay una fórmula que puede usar que calculará el incremento sin tener que ordenar los datos.
i = Fila () ;
permite = Tabla de datos actual () << obtener filas donde ( : Caja == : Caja [ i ] ) ;
Si ( ubicación ( como lista ( permite ) , i )[ 1 ] == 1 ,
1 ,
ranura [ permite [ ubicación ( como lista ( permite ) , i )[ 1 ]]] - ranura [ permite [( ubicación ( como lista ( permite ) , i )[ 1 ]) - 1 ]]
) ;
Re: Cómo usar la función Dif/Lag por grupo de columnas¿Puedes ordenar por :Box y luego aplicar la fórmula después de verificar que :Box==Lag(:Box,1)?