Conversión de tiempo en intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xTengo una tabla de datos con las columnas "Tiempo" (Numérico, continuo, con formato de 12 h h:m:s) y "Nombre" (Carácter, simplemente una lista del experimento al que está asociado cada punto de tiempo). Al graficar usando otras columnas no mencionadas aquí como eje Y, y Tiempo como eje X, surge el problema de que cada gráfico entre las variables de agrupación x se desplaza, ya que la escala del eje x permanece igual entre las variables de agrupación x (Figura 1).

Figura 1. Cada variable de agrupación x es una variable de columna "Nombre" con "Nombre" también como superposición.
Mi idea es escribir un guión para:
1. Crea una nueva columna
2. Codifique la nueva columna con una fórmula que convierta la columna "Tiempo" a tiempo en segundos, comenzando en "0" y contando hacia arriba con un intervalo específico (2 segundos en este caso), restableciéndose a 0 tan pronto como la columna "Nombre" cambie de valor.
Mis preguntas principales son:
1. ¿Es esto posible?
2. ¿Hay una forma más sencilla de hacer esto sin crear una nueva columna?
Actualmente en JMP 17.2.0 en Windows 10.
¡Gracias!
Exploración y visualización de datosRe: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xVea si esto hace lo que necesita.
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje x¡Gracias por la respuesta!
Desafortunadamente, eso devuelve la columna "Tiempo transcurrido" que se ve en la figura a continuación.

Probé el siguiente código, que también generó la columna "Tiempo (s)" en la figura anterior. Parece que ejecuta la función de establecer inicial a cero, pero no convierte nada más.
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
);
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xPuede que haya algo inesperado en tu columna :LocalTime. Probé mi fórmula en una tabla creada y funcionó correctamente. ¿Cómo está formateada tu columna :LocalTime?

Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xCreé una tabla de datos de ejemplo

Y luego ejecuté el siguiente JSL
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
)
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Obtuve el siguiente resultado

Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xBueno, no importa, ¡el código que publiqué funcionó! Tenía el nombre de mi columna mal escrito.:confounded_face:
La única pregunta que queda entonces es: ¿hay una forma más fácil de hacer esto sin crear una nueva columna?
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xRequiere una nueva columna. No tiene que ser persistente; es decir, podría existir solo mientras el gráfico esté presente.
Graph Builder(
Transform Column(
"Time (s)",
Formula( :LocalTime - Col Min( :LocalTime, :Name ) )
),
Show Control Panel( 0 ),
Variables( X( :"Time (s)"n ), Y( :Y Column ), Group X( :Name ) ),
Elements( Smoother( X, Y, Legend( 8 ) ) )
);
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xSiempre puedes usar una columna de transformación (virtual) al ejecutar el Constructor de Gráficos. De esta forma, no es necesario tener una columna real en la tabla de datos.
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje x¡Esto es perfecto! ¡Gracias a ti y a @txnelson por las excelentes soluciones!
Re: Conversión de tiempo a intervalos de tiempo y restablecimiento en función de los valores de la segunda columna para evitar el desplazamiento del eje xComo apunte adicional, el estándar en JMP es colocar las unidades de medida en la propiedad de columna "Unidades". En su caso, la diferencia radicaría en que el nombre de la columna sería "Tiempo"; sin embargo, por defecto, el valor de "Unidades" se muestra entre paréntesis, cambiando el valor mostrado a "Tiempo (s)".