Contar el número de elementos únicos en la columna que cumplen ciertos criterios.Supongamos que en "Clase Grande" quiero una fórmula que cuente la cantidad de nombres únicos de personas con una altura igual o inferior a la de la persona en la fila actual. ¿Cómo puedo hacerlo?
Tengo esto:
estaAltura = :altura;
Col N Unique( :name, :height <= thisHeight );
Entiendo que el segundo parámetro es el parámetro de agrupación, y que es más intuitivo intentar restringir lo que se pasa al primer parámetro, pero hasta ahora no he tenido suerte con nada de lo que he intentado.
Acceso a los datosRe: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.La función integrada más cercana que me viene a la mente es Col Rank( :height, < . El problema es: esto cuenta el número total de filas en o por debajo de esta altura, no el número de nombres únicos .
En su lugar, podrías probar una fórmula personalizada, como esta:
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.No estoy seguro de si se puede hacer con las funciones Col, ya que las nuevas se comportan de forma un poco diferente a las antiguas.
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.Anoche intenté algo muy parecido y JMP se bloqueó. Lo dejé funcionando toda la noche, y esta mañana, al encender el ordenador, la ventana de la tabla de datos de JMP estaba en blanco, no respondía, y el Administrador de tareas indicaba que el equipo solo estaba usando un núcleo y tenía más de 40 GB de RAM libres (así que no se quedó sin RAM ni consumió todos los núcleos de la CPU). Mi tabla tiene casi 400.000 filas, así que creo que esta solución podría ser de complejidad O(N²)...
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.@jthi Respecto a mi comentario anterior, esta también parece una solución O(N^2). (Es una lástima que una fórmula incorrecta pueda bloquear o provocar el cierre inesperado de toda la sesión; ayer perdí gran parte del trabajo de la tarde al intentar una solución similar).
Es una pena que las nuevas funciones de columna no funcionen igual. Quizás mi pregunta fue demasiado simple; también necesito las columnas de agrupación y no sé cómo implementarlas en esta solución. Probablemente tendré que hacerlo en Python, lo cual es lamentable porque la columna no se actualizará automáticamente y los scripts de Python aún no se pueden guardar en la tabla.
PD: Mi objetivo es aprender un poco de ti en cada interacción
-- ¿por qué este enfoque necesita la función "As Constant()"? ¿Qué pasaría sin ella?
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.Si necesitas una fórmula, no estoy seguro de qué tan bien funcionaría en Python. La función Constant() está ahí para evitar obtener la lista de nombres repetidamente en cada fila.
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.La solución en Python funcionó y, teniendo en cuenta todos los factores, fue bastante rápida de implementar y ejecutar.
Todavía espero que la función Col N Unique() se revise para una futura versión para que sea similar a las demás.
También me gustaría que existiera un "Libro de recetas de fórmulas JMP" que pudiéramos consultar. Llevo 33 años programando en VBA, AppleScript, Perl, Python y JavaScript (y un poco de C++), y JSL es, con diferencia, el más difícil de aprender y comprender. Todavía no entiendo por qué es necesario `As Constant()` ni qué hace exactamente. He leído casi toda la Guía de scripting, pero siento que hace falta otra.
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.No conviene evaluar valores que no cambien en cada fila de la ejecución de la fórmula. Eso es precisamente lo que hace la función Constant(): JMP evalúa la expresión solo una vez, en la primera fila.
Como Constante(expr)

Creo que básicamente podrías reemplazarlo con (probablemente no sea exactamente lo mismo, pero sí bastante parecido).
If(Row() == 1,
n = :name << get values;
);
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.A riesgo de desviar esta pregunta hacia un laberinto, una pregunta más:
¿Las fórmulas de columna se evalúan efectivamente una sola vez, pero cada expresión se evalúa en un contexto de matriz?
¿O se vuelve a ejecutar la fórmula completa una vez por fila, y la función Row() determina qué fila se está evaluando en ese momento?
¿O es que estoy malinterpretando algo más fundamental? Mi modelo mental de lo que hace JMP con las fórmulas se divide en partes incompatibles...
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.Alguien que conozca el funcionamiento interno de JMP puede dar una respuesta más precisa que mi suposición ( @Craige_Hales, por ejemplo). Considero que son expresiones (simplemente JSL) que se evalúan para cada fila, directamente en la tabla de datos, cuando es necesario. JMP determina cuándo se evalúan, a menos que yo suprima la evaluación. Existen algunas optimizaciones, como las funciones Col, que se evalúan (en la mayoría de los casos) solo una vez.
En la ayuda de JMP hay algunos enlaces útiles, pero solo puedo encontrar rápidamente este:
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.Aquí tienes una técnica para explorar la madriguera del conejo:
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

El operador ; es un operador JSL que ejecuta una serie de instrucciones y devuelve el valor de la última instrucción. Esto significa que se puede anteponer una instrucción print/show/write a un cálculo para generar un registro de actividad.
Arriba aprendí que la asconstant(...) se extrae antes de que se calcule la primera fila, pero con la fila 1 como la fila actual.
JMP también ordena las columnas para determinar cuáles se pueden evaluar primero.
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.La columna E tendría más sentido así:
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
La variable Q no es necesaria y oculta el propósito de AsColumn.
Re: Contar el número de elementos únicos en una columna que cumplen ciertos criterios.Aquí hay otro enlace que a veces puede ser útil (no fuerces todo en una sola fórmula) : Usando JMP > Crear fórmulas en JMP > Crear fórmulas en JMP

Otra ventaja es que, si se tienen varias fórmulas, resulta mucho más fácil verificar los resultados y, en algunos casos, depurar las fórmulas.