Fórmula condicionalEstoy intentando agregar una fórmula de columna que sea condicional a otras columnas. Tengo datos donde la columna "Resultados" está apilada por "Asunto" y "Producto" con múltiples valores sobre "Tiempo". Estoy intentando calcular la línea de base para cada valor en "Resultados" de modo que:
Nueva columna = "Resultados" – [valor de "Resultados" donde Tiempo=(1) para esa combinación de Asunto/Producto en particular]
Gracias
Automatización y secuencias de comandosRe: Fórmula condicional¿Puedes dar un ejemplo de los datos?Eso ayudará a encontrar una solución adecuada.
Re: Fórmula condicionalSi sus datos están ordenados por Asunto, Producto y Hora, este ejemplo funcionará
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
dt:age << set name( "Subject" );
dt:sex << set name( "Product" );
dt:weight << set name( "Results" );
dt << New Column( "baseline",
formula(
If( Row() == 1,
valueTime1 = :Results,
If( :Subject != Lag( :subject ) | :Product != Lag( :product ),
valueTime1 = :Results
)
);
baseline = :Results - valueTime1;
)
);Re: Fórmula condicionalHe incluido datos de muestra. Necesito agregar una nueva columna donde la fórmula toma el valor de Resultados de Tiempo (-5) para cada combinación de Asunto/Producto y resta ese valor de cada Resultado en la Combinación de Asunto/Producto.
Re: Fórmula condicionalA veces es más fácil atacar problemas como este en varios pasos, en lugar de escribir jsl complejo para una fórmula de columna. Este es un enfoque que utiliza "Subconjunto" para extraer las filas de Tiempo = -5, las vuelve a unir a la tabla de datos original con "Actualizar" y luego realiza una resta simple en una fórmula de columna. Si está ejecutando JMP 17, los flujos de trabajo son una excelente manera de crear y compartir este tipo de cosas.
Re: Fórmula condicionalEl JSL que se me ocurrió no es demasiado complicado.No escribí una fórmula sino un guión de tabla.Puede ejecutar esto cada vez que agregue más datos.
dt = Current Data Table();
OffsetArray = Associative Array();
TimeRows = dt << Get Rows Where( :Time == -5 );
For Each( {val, idx}, TimeRows, OffsetArray[:Subject[val] || :Product[val]] = :Results[val] );
For Each Row( dt, :New Column = :Results - OffsetArray[:Subject || :Product] );editar
Después de mirar más la tabla, noté que faltaban valores en algunas celdas: Resultados.Deberías recodificarlos a 0 o modificar un poco el script:
dt = Current Data Table();
OffsetArray = Associative Array();
TimeRows = dt << Get Rows Where( :Time == -5 );
For Each( {val, idx}, TimeRows, OffsetArray[:Subject[val] || :Product[val]] = If( !Is Missing( :Results[val] ), :Results[val], 0 ) );
For Each Row( dt, :Results with Offset = :Results - OffsetArray[:Subject || :Product] );
Re: Fórmula condicionalSólo una suposición, ya que no hay datos para probar esto.
:Result - Col Min(If(:Time == 1, :Result, .), :Group);
Editar:
Fórmula actualizada después de recibir datos de muestra
:Results - Col Min(If(:Time == -5, :Results, .), :Subject, :Product)