Problema
Problema 1: necesito obtener una lista de los valores únicos en una columna de la tabla de datos.
Problema 2: necesito obtener una lista de valores únicos en una estructura de datos JSL (lista o matriz)
Solución
Para el problema 1:
Solución 1: Utilice tablas de resumen.El JSL a continuación muestra cómo usar Summary() para obtener una tabla que tendrá una fila con cada valor único en una sola columna.Luego puede ejecutar más comandos de tabla JSL para obtener esos valores de la tabla de resumen.
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
Problema 2:
Ahora, en lugar de una tabla de datos, tiene una lista o matriz JMP:
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];las formas complicadas de hacer esto serían:
a) coloque los valores de la lista en una nueva columna de la tabla de datos y luego use el enfoque de resumen, O
b) escribir un bucle for algo complicado para buscar y registrar valores únicos
Afortunadamente, hay una manera más fácil, usando arreglos asociativos.
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
devuelve {"F", "M"} y {11, 12, 13, 14, 15, 17}, respectivamente (¡tenga en cuenta que esta es una buena lista ordenada!).Si desea los valores numéricos como un vector ordenado, puede usar
Matrix(Associative Array(agelist) << Get Keys);
que devuelve [11, 12, 13, 14, 15, 17].
Este enfoque también se puede utilizar en lugar de la Solución 1 para el Problema 1:
Problema 1, Solución 2:Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
devoluciones {"F", "M"} y [11, 12, 13, 14, 15, 17], respectivamente. Lo que esto está haciendo es
- obtener los valores de la columna especificada como una lista (si la columna es un carácter) o una matriz (si la columna es numérica)
- convertir esa lista o matriz en una matriz asociativa
- obtenga las claves para la matriz asociativa, que en este caso son los niveles únicos de los valores en la columna, devolviéndolos como una lista
- (si se usa Matrix() en la lista resultante, solo funcionará si los valores en la lista son todos números).
Summarize() es mucho más eficiente que la matriz asociativa, es muy obvio con 2 millones de filas de datos (lapso de tiempo de 1 segundo frente a 8 segundos). Si el rendimiento es crítico, use Summarize() siempre que sea posible.
Resumir( dt, smrz1 = by( :sexo ) ); Resumir( dt, smrz2 = by( :edad ) );
* Summarize() no crea una tabla de datos intermedia como << Resumen
La matriz asociativa es excelente en la forma en que ahorra el esfuerzo de colocar la lista/matriz en la tabla de datos, esta es la solución perfecta para tamaños de datos pequeños.