Cómo identificar valores mínimos y máximos en grupos de datosSupongamos que tomo a todos los estudiantes de la clase grande y los pongo en grupos por género y edad, por ejemplo, niños de 12 años en un grupo, niñas de 12 años en otro, etc.
Con esa configuración, me gustaría crear una columna de fórmula que tenga un 1 si ese grupo tiene la altura máxima más baja para su edad en ambos sexos, y un 0 en caso contrario.
Por ejemplo, en estos datos:
| Grupo | Nombre | Altura | NUEVA COLUMNA |
| Niñas de 12 años | Katie | 59 | 0 |
| | Jane | 55 | 0 |
| | Jaclyn | 66 | 0 |
| | Lillie | 52 | 0 |
| Niños de 12 años | TIM | 60 | 1 |
| | JAIME | 61 | 1 |
| | Roberto | 51 | 1 |
La altura máxima para las niñas es 66 y para los niños es 61, por lo que el grupo de los niños tiene la altura máxima más baja para su edad, por lo que la nueva columna de fórmula tendría un 1 para Tim, James y Robert, y un cero para Katie, Louise, Jane, etc.
¿Es esto posible en una columna de fórmula?
(Puedo compartir lo que he probado, pero estoy tratando de evitar el xyproblem, http://xyproblem.info aquí...)
Análisis y modelado de datos básicosExploración y visualización de datosRe: Cómo identificar los valores mínimos y máximos en los grupos de datosPuedes utilizar las agregaciones Col...
editar: si alguien preguntara por el género del estudiante con menor altura por grupo de edad:
Primero use Col Min para encontrar el estudiante con la altura mínima por edad.
Luego utilice Col Max para difundir este conocimiento entre todos los estudiantes del mismo sexo.
entonces:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
Como lo pediste
una columna de fórmula que tiene un 1 si ese grupo tiene la altura máxima más baja para su edad en ambos sexos, y un 0 en caso contrario
El enfoque debe corregirse
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
A lo largo de la idea de:
- ¿Cuál es la altura máxima por edad y género?
- Toma los valores y encuentra la altura mínima (máxima) por edad.
- which student?
[Ah, no, no queremos un estudiante al azar, ¡solo queremos un estudiante de máxima altura!]
-> replace :height with Col Maximum( :height, :age, :sex ) *) </CODE>use col max to spread the 1 to all other students with the same sex and age</STRIKE><BR /><STRIKE>Establezca el otro género en 0 o 1, si hay un niño y una niña con la misma altura.</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">Esta parte ya no la necesitamos</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">... y terminamos exactamente con la solución de Jarmo (ver abajo)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">Re: Cómo identificar los valores mínimos y máximos en los grupos de datos</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>Problema XY:<BR /> gracias : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">Re: Cómo identificar los valores mínimos y máximos en los grupos de datos</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>Vaya, eso parece funcionar, pero mi cerebro ni siquiera puede comprender cómo funciona esto...</P><P> </P><P>Déjame intentar explicarlo aquí y tal vez puedas ayudarme a entenderlo.</P><P> </P><P>Comenzando con: Col Máximo( :altura == Col Mínimo( :altura, :edad ), :sexo, :edad )</P><P> </P><P>Col Minimum( :height, :age ) --> devuelve la altura mínima para todos los estudiantes de esta edad</P><P> </P><P>:height == Col Minimum( :height, :age ) --> devuelve verdadero/falso (1/0) si la columna de altura de esta fila coincide con esa altura mínima</P><P> </P><P>Col Maximum( <1 o 0 para esta fila> , :sex, :age ) --> uh... esto no tiene sentido, pensé que el máximo de columna funciona agrupando los datos por las columnas de grupo (:sex, :age), y luego encuentra el máximo de columna de los valores o la columna en el primer argumento - que ahora es solo un verdadero/falso o 1/0 - y luego devuelve el valor máximo correspondiente para el grupo de esta fila, es decir, los valores de esta fila para :sex y :age.</P><P> </P><P>Obviamente eso está mal, ¿qué me estoy perdiendo aquí?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">Re: Cómo identificar los valores mínimos y máximos en los grupos de datos</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>Existen muchas formas de hacer esto, por ejemplo, utilizando diferentes combinaciones de funciones estadísticas de columnas (como ya se mostró). Aquí hay otra opción (creo que debería funcionar con lo que estás buscando)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Primero, Col Min() busca Col Max() en todos los grupos de edad y sexo SOBRE la edad y luego se compara con los máximos de los grupos de edad y sexo y, si es igual al mínimo de los grupos de edad , el valor es 1.
Para entenderlos más fácilmente, creo que es beneficioso escribirlos todos por separado y hacerlos más fáciles de entender, en este caso:
First column with Col Max(:height, :age, :sex) (max_height_for_agesex)
- Next column then utilizes that
Col Min(:max_height_for_agesex, :age) age_minmax_age
- And the final one is the comparison of these two
:max_height_for_agesex == :age_minmax_age
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosGracias @jthi . Aunque todavía estoy confundido.
Empezando con esto:
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Cuando JMP evalúa "Col Max(:height, :age, :sex)", ¿qué devuelve? ¿Un valor único o una lista?
Puedo crear una nueva columna con esa fórmula y produce una lista de valores que terminan en las filas de la columna.
Pero dentro de una fórmula, parece estar devolviendo un único valor, por ejemplo:
a = col max(:height, :name);
type(a);
... devuelve "Número".
Y si creo un nuevo script e ingreso:
a = col max(:height, :name); <BR />show(a);
Dice "número de fila no válido", pero sin el ", :name" funciona bien y devuelve 70. Parece que JMP está haciendo algún tipo de significado específico del contexto con estas funciones. ¿Cómo funciona esto? ¿Se explica en alguna parte?
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosCuando ejecuta la fórmula de una columna de fórmula en una celda, calcula el valor de la fila actual.
Cuando lo ejecuta en JSL, lo calcula para la fila actual.
Suena igual, pero el valor predeterminado para la "fila actual" es "fila 0", es decir, no hay números válidos.
También puede comprobar el cálculo para cualquier fila (diferente del valor predeterminado "0").
Simplemente coloque una fila()=xy delante de su cálculo y el cálculo se realizará para la fila xy .
Entonces, por ejemplo
row()=5;
col max(:height, :age)
regresará 66.
:la edad en la fila=5 es 12 y la altura máxima para la edad = 12 es 66 .
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosSupongo que funciona así:
Col... primero recorre todas las filas y almacena los resultados del primer argumento.
Lo calcula fila por fila, por ejemplo, si el primer argumento es aleatorio uniform() .
Además, almacena una tabla de búsqueda para el grupo adicional por argumentos.
Luego, divide los datos en subconjuntos, calcula los valores agregados y luego distribuye los valores agregados nuevamente en las filas respectivas.
Re: Cómo identificar los valores mínimos y máximos en los grupos de datos
Cuando JMP evalúa "Col Max(:height, :age, :sex)", ¿qué devuelve? ¿Un valor único o una lista?
Valor único.
Si crea un script y desea probar lo que está sucediendo, debe utilizar Row() SI está usando por columnas (sin por columnas funcionará ya que JMP sabe que debe usar todas las filas). Row() será 0 de manera predeterminada en JMP, por lo que debe cambiarlo, por ejemplo, a Row() = 1. Creo que he visto alguna documentación sobre esto en la Ayuda de JMP o en el índice de scripts, pero no tengo idea de dónde (podría estar relacionado con Row(), For Each Row o Col funciones estadísticas).
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
max_height = Col Max(:height); // works fine as no by var used and uses all rows
Show(Row());
Col Max(:height, :age); // won't work as JMP doesn't know which age to use -> it needs row information
Row() = 1;
cur_age = :age;
cur_maxheight = Col Max(:height, :age);
Write("\!Max height for age ", cur_age, " is ", cur_maxheight);Re: Cómo identificar los valores mínimos y máximos en los grupos de datosParece que estás diciendo que JMP está envolviendo toda la fórmula de la columna en un bucle que itera "Row()" sobre las filas de la tabla, calculando un valor para cada fila.
Eso *tendría* sentido, excepto por esta expresión:
Col Min(Col Max(:height, :age, :sex), :age)
... que según esa lógica, cuando, por ejemplo, Row() se establece en i=1, entonces calcularía Col Max() como el valor más grande en la columna :height de toda la tabla donde :age[i] == :age[1] y :sex[i] == :sex[1], que devuelve un solo número. Luego intenta calcular Col Min() de ese único número, que por definición solo puede ser ese número. Realmente me cuesta entenderlo.
Sigo pensando que Col Max() debe estar devolviendo una lista, entonces Col Min() podría estar mirando todas las filas de esa lista donde :age[i] == :age[1].
Pero mi idea aquí requiere que JMP haga algo similar a lo que hace Perl, básicamente llevar un registro de si algo se llama en un contexto escalar o de lista, es decir, si una función se usa de una manera que espera una lista de vuelta, devuelve una lista, de lo contrario devuelve un escalar. De esa manera, Col Max() aquí podría devolver una lista para Col Min(), que a su vez devolvería un valor escalar.
Supongo que me estoy perdiendo algo aquí y no puedo precisar qué es.
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosNo, la idea NO es que JMP recorra UNA SOLA vez fila por fila la tabla y calcule la expresión completa.
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosPara investigar qué está haciendo JMP, primero creemos una tabla de datos muy pequeña...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt = dt0 << Clear Select << Select Rows( [2, 10, 11, 25] ) << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
nr = n rows(current data table());
... y una columna de fórmula con alguna funcionalidad de registro:
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));La salida:

Entonces, para este caso, JMP ejecuta el código varias veces.
Preguntémonos más tarde...
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosAhora vamos a comprobarlo con
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
...y obtenemos *)

Lo cual demuestra:
- Para el ejemplo simple, JMP evalúa el primer argumento de Col Min para cada fila.
- para la segunda versión, JMP evalúa el primer argumento de Col Min para cada fila y como hay otra agregación Col... dentro de este código, esto es seguido por el bucle ColMax : primer argumento de Col Max para cada fila
Al final, JMP conoce el valor de ColMax(...) para cada fila y luego puede evaluar Col min con estos valores.
Esto es más o menos lo que dices, con el contexto de lista. Pero creo que JMP almacena los resultados en el contexto de la tabla de datos, de modo que pueda combinar los VALORES con información adicional como row(), row states()...
pero alguien de JMP -o @jthi- podría explicarlo mejor...
*) de nuevo: varias veces:
Puede encontrar más detalles aquí:
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-possively-bugged-on/mp/613887/highlight/true#M81398
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosOtra forma de probar la ejecución del código:
i = 0;
j = 0;
New Column( "test",
Formula(
Col Min(
i++;
Col Max(
j++;
:height;,
:age,
:sex
);,
:age
)
)
);
// too early
Show( i );
Show( j );
Current Data Table() << run formulas();
// after calculating the values
Show( i );
Show( j );

yo = 5 x 4
j = 5 x 5 x 4
Re: Cómo identificar los valores mínimos y máximos en los grupos de datos-
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosLas funciones estadísticas de Col tienen su propia magia que otras funciones no tienen, por ejemplo, tienen almacenamiento en caché interno y admiten variables. https://www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosSí, esta forma inteligente de preparar los datos es extremadamente útil:
Ejemplos de cómo funciona la magia:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Clear Select << Select Rows( Index( 5, 40 ) ) <<DELETE rows=""></DELETE>newCol << Set Formula(Col Min(Print(row());:height,:age)); // 2 x 4<BR /><BR />newCol << Set each value(Col Min(Col Max(Print(row());:height,:sex),:age)); // 4 + 4
newCol << Set Formula(Col Min(Col Max(Print(row());:height,:sex),:age)); // 2 x 4 + 4
Asegúrese de no encontrarse con uno de estos grifos:
i=1;<BR />newCol << set each value (Col Min(Print("X");:height,:age)); // 16 = 4 x 4
newCol << set Formula (Col Min(Print("X");:height,:age)); // 20 = 5 x 4<BR />newCol << set Formula (Col Min("x";Print(3);:height,:age)); // 20 = 5 x 4
newCol << Set Formula(Col Min(i;Print(row());:height,:age)); // 20 = 5 x 4<BR />
newCol << set each value (Col Min(Col Max(Print("X");:height,:sex),:age)); // 80 = 5 x 4 x 4
newCol << set Formula (Col Min(Col Max(Print("X");:height,:sex),:age)); // 100 = 5 x 5 x 4<BR />newCol << set Formula (Col Min(Col Max("X";Print(3);:height,:sex),:age)); // 100 = 5 x 5 x 4
newCol << Set Formula(Col Min(Col Max(i;Print(row());:height,:sex),:age)); // 100 = 5 x 5 x 4
Las agregaciones de columnas se vuelven cautelosas cuando ven
- instrumentos de cuerda
- variables
- ?
luego cambian a una velocidad reducida y calculan cada valor para cada fila (+1) ... en un árbol jerárquico.
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosNo estoy seguro de ser lo suficientemente inteligente como para seguir todo lo que estás haciendo aquí.
Parece que estás de acuerdo conmigo, es decir, ¿las funciones Col... hacen cosas diferentes en contextos escalares y de lista?
Re: Cómo identificar los valores mínimos y máximos en los grupos de datosEsperemos un año y discutámoslo nuevamente: las cosas podrían cambiar.