¿Cómo uso la Fórmula Col Máxima con una condición "dónde"?Hola, tengo un problema en el que quiero formular una nueva columna como punto de referencia para todos los demás países. Si hay más filas para el país, quiero tomar su valor máximo como punto de referencia. Consulte el siguiente ejemplo para obtener una aclaración.
Los datos se ven así:
Período de valor del país
10 201301
30 201301
B 20 201301
C 50 201301
D 40 201301
Lo que quiero lograr (con fórmula de celda): Col Máximo (:valor,:período,:país) donde :país == "A"
Producción:
País Valor Período Punto de referencia
10 201301 30
30 201301 30
B 20 201301 30
C 50 201301 30
D 40 201301 30
Como puede ver, quiero comparar el valor máximo de solo el país A.
Probé con Col Maximum (:value, :period, :country == "A") y devolverá "50"
Col Máximo (:valor, :período, :país) y Col Máximo (:valor, :período, :país == "A") ambos devuelven "50"
¡Estoy bastante seguro de que hay una solución simple para esto!
¡Espero que puedan ayudar!
¡Gracias Gracias!
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Gracias.Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Col Maximum() solo es viable en una fórmula, donde la salida es un resultado de separación por fila.Para hacer lo que quieras, usa la función Summarize().
Ver:
Ayuda==>Índice de secuencias de comandos==>Resumir
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Hola, Mark,
Trató de obtener el peso máximo por edad o sexo, pero solo produjo un valor en el siguiente script.
por edades, había 6 edades diferentes, para cada una de ellas, me gustaría calcular el peso máximo para cada edad.
Names Default To Here( 1 );
Clear Log();
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
max_weight_by_age = Col Max( :weight, :age );
max_weight_by_sex = Col Max( :weight, :sex );
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Podría agregar esta fórmula a una nueva columna en la tabla de datos de ejemplo de Big Class:
Col Max( :weight, :age )
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Hola, Mark,
¿Puede dar un ejemplo sobre cómo usar cuando usa col Max?
Gracias.Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Consulte Ayuda > Índice de secuencias de comandos > Funciones:

Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Gracias Jim, quise decir solo resumir. Cómo lo hago es (dos comandos jsl):
Resuma en la columna, cree una nueva tabla con valores (mín./máx./o cualquier otra estadística para la columna).
Luego actualizo la tabla principal usando la tabla resumida haciendo coincidir las entradas de fila.
Tenía curiosidad por saber si hay una opción condicional en el comando Max col() que puede identificar valores de columna únicos y eliminar la necesidad de este paso adicional. (eliminaría una mesa extra y 2 escalones extra).
Aprecio tu ayuda.
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Por lo general, uso la función Summarize(), en lugar de la plataforma de resumen, para determinar fácilmente qué niveles se encuentran dentro de una columna.Luego, a partir de ahí, solo tiene que generar las fórmulas que necesita para hacer el trabajo.
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Supongamos que la columna del país tiene varios nombres y no conozco todos los valores posibles. ¿Cómo se puede modificar esta consulta para hacer eso?
Puedo hacer eso creando una tabla de resumen y luego actualizando la tabla nuevamente, pero ese parece ser un método ineficiente, tenía curiosidad si se podía hacer en un solo paso como este.
Gracias por adelantado.
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?¡Lo siento por la respuesta tardía! ¡Gracias por la solución!Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Dada la forma en que expuso sus necesidades, suponiendo que sepa cuál es el país que tiene las entradas múltiples.
dt = Current Data Table();
rowperiod = :Period[Row()];
Max(
:Value[dt << get rows where(
:Country == "A" & :period == rowperiod
)]
);
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?
@hogi escribió:Hay un comando de una línea para eliminar mujer del cálculo de la media, pero para escribir los valores en las filas respectivas con "mujer"?
Quiero decir, algo como:
Col Mean( :weight, :age, where( :sex == "M" ) )
?
Re: ¿Cómo utilizo la Fórmula Máxima de Col con una condición de "dónde"?Aplique un If() a la columna :weight en la ecuación

col Mean( if(:sex=="M", :weight,.), :age)
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?¡Fantástico!
Y tan lógica - ¡cuando lo ves!
Estoy muy decepcionado conmigo mismo porque no encontré esta solución por mi cuenta.
Re: ¿Cómo uso la fórmula de columna máxima con una condición "dónde"?Hmm, después de un poco de entusiasmo, me sentí un poco más tranquilo.
Parece que el if dentro de la agregación de columnas lo hace muy lento, especialmente si hay una comparación de caracteres dentro del if, y especialmente x 2 si hay una conversión char(num). Entonces, el tiempo escala ~ cuadráticamente con el aumento del tamaño de la tabla.
Lo bueno: Col Median (que uso la mayor parte del tiempo) no se ve afectado por este "error".:)
¿Existe alguna solución fácil para Col Min, max, media...?
De lo contrario, escribiré un deseo para implementar una forma oficial de calcular Col xyz con una condición where ...
Sería mucho más rápido si el conjunto de datos se redujera primero ( donde ) y luego se agregara ( Col xyz ) y luego los valores se distribuyeran en todas las filas respectivas.

Ver más...Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
trialRun = 0;
tryAgain = Function( {},
trialRun += 1;
Rownumbers = N Rows( mydt );
t1 = HP Time();
mydt << New Column( "col A", Formula( Col Mean( :weight ), :sex ) );
t2 = HP Time();
mydt << New Column( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) );
t3 = HP Time();
mydt << New Column( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t4 = HP Time();
mydt << New Column( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) );
t5 = HP Time();
mydt << New Column( "col E", Formula( Char( :age ) == "12" ) );
t6 = HP Time();
tt1 = Round( (t2 - t1) / 1000000, 4 );
tt2 = Round( (t3 - t2) / 1000000, 4 );
tt3 = Round( (t4 - t3) / 1000000, 4 );
tt4 = Round( (t5 - t4) / 1000000, 4 );
tt5 = Round( (t6 - t5) / 1000000, 6 );
If( trialRun == 1,
tt1Ref = tt1;
tt2Ref = tt2;
tt3Ref = tt3;
tt4Ref = tt4;
tt5Ref = tt5;
RNref = Rownumbers;
);
tr1 = Round( tt1 / tt1Ref );
tr2 = Round( tt2 / tt2Ref );
tr3 = Round( tt3 / tt3Ref );
tr4 = Round( tt4 / tt4Ref );
tr5 = Round( tt5 / tt5Ref );
RNratio = Round( RowNumbers / RNref );
Wait( 0.1 );
Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) );
Wait( 0.1 );
mydt = mydt << Concatenate( mydt, mydt, mydt );
Wait( 0.1 );
If(
ex = New Window( "results",
<<TYPE></TYPE></CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">Nombres predeterminados Aquí (1); Si (Está vacío (mydt), mydt = Abrir ("$SAMPLE_DATA/Big Class.jmp" ) ); trialRun = 0; tryAgain = Function( {}, trialRun += 1; Rownumbers = N Rows( mydt ); t1 = HP Time(); mydt << Nueva columna( "col A", Fórmula( Media de la columna( :peso ), :sexo ) ); t2 = HP Time(); mydt << Nueva columna( "col B", Fórmula( Media de la columna( Si( :edad == 12, :peso, . ), :sexo ) ) ); t3 = HP Time(); mydt << Nueva columna( "col C", Fórmula( Media de la columna( Si( :sexo == "M", :peso, . ), :edad ) ) ); t4 = HP Time(); mydt << Nueva columna( "col D", Fórmula( Media de la columna( Si( Char( :edad ) == "12", :peso, . ), :edad ) ) ); t5 = HP Time(); mydt << Nueva columna( "col E", Fórmula( Char( :age ) == "12" ) ); t6 = Tiempo HP(); tt1 = Redondear( (t2 - t1) / 1000000, 4 ); tt2 = Redondear( (t3 - t2) / 1000000, 4 ); tt3 = Redondear( (t4 - t3) / 1000000, 4 ); tt4 = Redondear( (t5 - t4) / 1000000, 4 ); tt5 = Redondear( (t6 - t5) / 1000000, 6 ); Si( trialRun == 1, tt1Ref = tt1; tt2Ref = tt2; tt3Ref = tt3; tt4Ref = tt4; tt5Ref = tt5; RNref = Números de fila; ); tr1 = Redondear( tt1 / tt1Ref ); tr2 = Redondear( tt2 / tt2Ref ); tr3 = Redondear( tt3 / tt3Ref ); tr4 = Redondear( tt4 / tt4Ref ); tr5 = Redondear( tt5 / tt5Ref ); RNratio = Redondear( Números de fila / RNref ); Esperar( 0.1 ); Intentar( mydt << eliminar columnas( "columna A", "columna B", "columna C", "columna D", "columna E" ) ); Esperar( 0.1 ); mydt = mydt << Concatenar( mydt, mydt, mydt ); Esperar( 0.1 ); Si( ex = Nueva ventana( "resultados", < <TYPE></TYPE></DIV></DIV>
In a previous version I had "ms" in the table instead of seconds. Unfortunately, it's 1000x more severe ...
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Pregunta interesante: ¿sigues esperando una respuesta?
Hay un conjunto de publicaciones con preguntas similares sobre cómo restringir el Col ... agregación funciones a un subconjunto específico.
(principalmente: restringirlos al subconjunto de filas no excluidas)
Calcule la media de columna mientras restringe las observaciones utilizadas
JMP10: las funciones Col Max() y Col Min() devolvieron los datos de la fila excluida
Funciones de columna y estados de fila
La idea:
Si uno está interesado en la altura media, puede agregar todas las filas, o puede agregar entradas masculinas y femeninas por separado.
Para el segundo, la solución es casi tan fácil como para el primero: solo use una variable GroupBy adicional para dividir entre datos deseados y no deseados.
Pero, lo que un usuario a menudo necesita además: los valores deben aparecer en todas las filas respectivas (es decir, también para mujeres).
[El ejemplo con la columna de referencia en la publicación original ilustra por qué tal comportamiento podría tener sentido].
Con GroupBy, es fácil obtener los valores correctos, pero cómo distribuirlos en TODAS las filas.
Si hay algo como una tabla de búsqueda detrás de un Col ... agregación función, la función utiliza el mismo identificador
1) para dividir filas en diferentes grupos para la agregación ("M" / "F"):
Judy es mujer, el peso en la fila de Judy debe incluirse en peso medio femenino
2) como índice al leer una entrada de la tabla de búsqueda ("M" / "F"):
Judy es mujer, la nueva columna debe contener peso medio femenino en la fila de judy
Entonces, el hombre y la mujer obtienen los mismos valores porque el identificador es el mismo (media 1), o obtienen valores diferentes porque el identificador es diferente (media 2).
es decir:
Un usuario de Jmp poder use la función GroupBy para eliminar valores del cálculo a través de:
- calcular diferentes valores para diferentes subgrupos
- volcar los resultados no deseados
pero luego se pone
- conseguir diferentes valores para diferentes subgrupos
gratis, incluso si no ordenó esta opción (OK, el código cuenta otra historia, pero pensemos en lo que el usuario quería) 
Hay una comando de una línea para eliminar mujer del cálculo de la media, pero para escribir los valores en las filas respectivas con "mujer"?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column("mean1", Formula(Col Mean(:weight, :age)));
dt << New Column("mean2", Formula(Col Mean(:weight, :age, :sex)));
dt << New Column("mean2", Formula(If(:sex=="M", Col Mean(:weight, :age, :sex))));
dtM = dt << subset( Rows( dt << get rows where( :sex== "M" ) ), selected columns( 0 ));
dtM << New Column("mean_M", Formula(Col Mean(:weight, :age)));
dt << Update(
With( dtM ),
Match Columns(:age = :age ),
Add Columns from Update Table( :mean_M ),
Replace Columns in Main Table( None )
);
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Un enfoque para acelerar las cosas órdenes de magnitudes (!!!):
En lugar del muy lento Col Mean con la comparación de caracteres dentro de la instrucción if :
mydt << New Column( "col C", Formula( Col Mean( If( :name=="Robert", :weight, . ), :age ) ) );
usar @cwillden El truco de: usa la comparación como un argumento GroupBy:
Resuelto: Re: Obtener filas que satisfagan una condición dentro de una fórmula de columna - Comunidad de usuarios de JMP
mydt << New Column( "col C", Formula(if(:name=="Robert" , Col Mean( :weight, :age, :name=="Robert" ),. ) );
para dividir los datos en 2 grupos: datos deseados y no deseados (captura de pantalla a continuación con @10k filas -> Factor 2000 más rápido 
.. y luego elimine los resultados no deseados a través de la declaración if fuera de la agregación Col Mean.
Con la comparación para la columna :sexo este enfoque sería un exceso de ingeniería; por eso cambié a la :nombre comparación para ilustrar el concepto.
Esto también está un poco sobrediseñado, pero espero que la idea se aclare 

Ver más...
Re: ¿Cómo uso la fórmula Col Maximum con una condición de "dónde"?Acabo de notar:
- el truco no sirve para
:name=="Roberto"
parece ser un caso especial: la comparación simplemente se ignora (en Jmp 16 y 17.1).
extraño ...
- Con todo el entusiasmo por las nuevas posibilidades (utilizando condiciones (!) como GroupBy) y por la mejora de la velocidad, me perdí por completo que más o menos volví a donde comencé: agregación de Col con opciones de Group By.
Entonces, no alcancé mi objetivo real: llenar "las otras" filas con valores, como se explica aquí:
¿Cómo-uso-la-fórmula-de-col-máxima-con-una-comilla-donde-quot/mp/571889/highlight/true#M78145
Pero hay una solución alternativa: en lugar de un lento
New Column( "newcol", Formula(Col Mean( if(:sex=="M",:weight,.), :age ) ));
tenga cuidado de que solo haya opciones de Agrupar por dentro de Col Media lenta
... luego use el rápido Col Median para distribuir los valores a las otras filas:
New Column( "newcol", Formula(Col Median(If(:sex =="M" ,Col Mean( :weight, :age, :sex),.),:age) ));
Además: el tema llamó la atención del equipo de desarrollo de Jmp:
Col Median (y otros): agregue la opción "Dónde"
@SamGardner escribió:
Estado cambiado a: ¡Nos gusta! (en la cola)... trabajamos en formas de mejorar la forma en que se utilizan las cláusulas Where() en JMP.
Parece que pronto habrá una solución mucho más fácil para el problema 
Re: ¿Cómo uso la fórmula de columna máxima con una condición "dónde"?Dato curioso:
Buscar "M" en una lista de cadenas es mucho más rápido que comparar "M" con una cadena:

Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
tryAgain = Function( {},
write ("\!nrows: ", nrows(mydt),"\!n");
t0 = HP Time();
mydt << New Column( "char=char", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("char=char: ",t,"\!n");
t0 = HP Time();
mydt << New Column( "contains", Formula( Col Mean( If( contains(Eval List({:sex[]}) ,"M"), :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("contains: ",t,"\!n");
If(
ex = New Window( "",
<<TYPE></TYPE><BR />why?!?<BR />Which secret is behind this finding?
Re: ¿Cómo uso la fórmula de columna máxima con una condición "donde"?2025 - JMP19 viene con una mejora de velocidad significativa para las comparaciones de cadenas.
¡Frío!
Además de eso, la sugerencia
col Mean(:weight, :age, where(not(excluded())))
Se introdujo para transformar columnas en informes. Se volvió tan compacto como:

Por otra parte, todavía es muy difícil obtener la fórmula correcta para una agregación restringida a, por ejemplo , :sex="M" :
<SPAN class="token function">if<SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"& not(excluded()),<BR /></SPAN> col Max</SPAN><SPAN class="token punctuation">(</SPAN><SPAN> </SPAN><SPAN class="token function">if</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>weight<SPAN class="token punctuation">,</SPAN><SPAN class="token punctuation">.</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>age, excluded()<SPAN class="token punctuation">)<BR /> , .<BR />);</SPAN>
Algo como
col Max(:weight, :age, @excluded, where(:sex=="M"))
Podría ayudar mucho.
Hm: Col Median (y otros): agregar opción "Dónde" : ¡1 Kudo en 3,5 años! Qué extraño.