Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Digamos que estaba usando el conjunto de datos Big Class y quería crear una nueva columna para el peso promedio del estudiante más bajo de la misma edad. ¿Cómo lo configuro?
Sé cómo hacer la primera parte (encontrar la altura del estudiante más bajo de la misma edad), que es solo una Col Mean con una byVariable:
Col mínima( :altura, :edad )
Pero lo que no sé cómo hacer es tomar el peso promedio de ese subconjunto de estudiantes donde (A) la edad de ese estudiante coincide con la edad del estudiante en esta fila, y (B) la altura de ese estudiante coincide con la altura más corta para los estudiantes de su edad.
Combinación y limpieza de datosRe: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Fantástico, gracias! Cada día aprendes dos cosas nuevas 
Para combinar las fórmulas de Cars en una columna, se ve así:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Adjunté una tabla de datos con fórmulas un poco diferentes y la dividí en más de una (las anteriores para Cars podrían haber tenido algunos problemas debido a la agrupación para pesos no máximos). Esto también te permitirá ver qué sucede si hay empates.
:Size[idx] le permite acceder al valor en la columna :Size con el idx especificado, también puede acceder a varios con :Size[[1,2,3]] por ejemplo (esto podría ayudar un poco Subíndice de tabla de datos )
Ejecute esto en la ventana del script, eche un vistazo al registro y compárelo con la tabla de datos:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Gracias @jthi ¡Eso funciona maravillosamente!
Para asegurarme de que lo entiendo, parece que la instrucción If está creando una columna "virtual" que anula cualquier fila donde la altura no sea la altura mínima para esa edad, y luego usa Col Mean para operar en esa columna "virtual". ¡Buen truco!
No me parece que la fórmula para el ejemplo de Cars esté funcionando; por ejemplo, la fórmula devuelve "pu" para Chevrolet aunque el Chevy más pesado (el Suburban) es "mpv" y devuelve "med" para Chrysler aunque el Chrysler más pesado (el de la Quinta Avenida) es "hev". De todos modos, para mi aplicación ya resolvió el problema con su fórmula de Big Class, pero, solo por curiosidad y para avanzar en mi JMP-fu, tengo curiosidad por saber más sobre lo que sucede en la fórmula final. ¿Qué hace el operador de corchetes, por ejemplo, ":Tamaño[...]"?
Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Puedes hacer esto con una fórmula (obteniendo la media de los pesos mínimos en el grupo de edad):
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
Divida la fórmula en dos fórmulas diferentes para que sea un poco más fácil de entender:
Valores de peso mínimo:
If(:height == Col Min(:height, :age),
:weight,
.
)
y luego la media de ese valor:
Col Mean(:MinWeightVal, :age)
Col Mean ignorará los valores faltantes, por lo que esto debería funcionar
Con automóviles (no estoy exactamente seguro de cómo desea que se vean los datos:
Peso máximo para marca:
Col Max(:Wt, :Make)
Tamaño para peso si lo quieres en una sola fila:
If(:Wt == :Max Wt for Make,:Size,"")
El mismo valor para varias filas, lo más probable es que puedas eliminar algunas funciones Col desde allí, pero esta fue la más fácil que se me ocurrió rápidamente:
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
escupe en múltiples fórmulas diferentes para ver cómo funciona
Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Hola @markschwab ,
Si puede permitirse el lujo de ordenar la tabla, intente esto:
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
A estas alturas también me gustaría saber la solución de la fórmula directa sin clasificar.
Si necesita recurrir a los datos más adelante, simplemente elimine la fórmula o suprima la evaluación.
Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Gracias Ron. Creo que eso podría funcionar para mí (aunque sería bueno poder hacerlo dentro de la misma hoja de datos).
Para hacerlo más fácil, estaría bien que mi aplicación real usara una búsqueda en lugar de una media: la columna que tomaré como máximo es una marca de tiempo, y podemos asumir que hay una fila única para cada grupo con el marca de tiempo más reciente.
Entonces, por ejemplo, usando el conjunto de datos de Cars, mi problema sería:
Cree una columna "Tamaño de peso máximo para la marca" que encuentre el automóvil con el peso más alto entre todos los automóviles con la misma marca y luego busque el tamaño de ese automóvil con peso máximo.
Re: Crear fórmula: ¿media de Col A para filas donde Col B es mínima en el grupo Col C?Hola @markschwab ,
Hasta que alguien nos muestre la forma elegante de usar una fórmula de columna, puedes probar lo siguiente:
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
una fórmula sería mejor ya que también se actualizará automáticamente.
háganos saber si ayuda.
ron