¿De qué manera sería posible aplicar el mismo filtro de datos a varias tablas de forma dinámica?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola a todos,
Actualmente estoy construyendo una herramienta de análisis de datos usando JMP. Básicamente, usaremos JMP para permitir que nuestro cliente interactúe con la salida de la simulación que se generó con otro software.
La salida de la simulación se almacena en varias tablas con diferentes características pero con los mismos identificadores. Por ejemplo, una tabla contiene valores de salida asociados globalmente con 1 réplica de simulación, una tabla diferente contiene la salida asociada con cada agente presente en una réplica de simulación (y, por lo tanto, tiene varias líneas por réplica), y otra tabla puede contener la salida para cada paso de tiempo de cada réplica de simulación (incluyendo así muchas líneas por réplica). Lo que todas las tablas tienen en común son columnas con identificadores y parámetros de entrada.
Ahora el desafío: me gustaría poder crear un filtro de datos que filtre todas las tablas de datos simultáneamente (por supuesto, esto se hace sobre la base de la información que comparten (por ejemplo, un identificador)). Mi objetivo subyacente es organizar los datos en el formato de tabla más conveniente y al mismo tiempo poder presentar información dinámicamente de diferentes tablas usando gráficos, etc.
¡Cualquier idea que pueda tener, por favor hágamelo saber!
Gracias de antemano
Re: ¿De qué manera sería posible aplicar el mismo filtro de datos a varias tablas de forma dinámica?El JSL en:
http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646
es bastante antiguo y (¡afortunadamente!) obsoleto desde que agregamos el 'controlador de estado de fila' (creo que en JMP 10). Esto tiene una variedad de usos, y el siguiente código muestra cómo puede explotarlo en este caso.
// ian.cox@jmp.com : 03Noviembre2014
// Demostración de cómo vincular varias tablas secundarias a una tabla principal mediante un controlador de estado de fila
Nombres predeterminados a aquí ( 1 ) ;
// Hacer algunas tablas para usar
dt1 = NuevaTabla ( "Tabla 1" ,
NuevaColumna ( "IDENTIFICACIÓN" , Numérico , continuo , Valores (( 1 :: 10 ) ` )) ,
NuevaColumna ( "Respuesta" , Numérico , Continuo , Fórmula ( AleatorioNormal ( 0 , 1 )))
) ;
dt2 = NuevaTabla ( "Tabla 2" ,
NuevaColumna ( "IDENTIFICACIÓN" , Numérico , continuo , Fórmula ( Entero aleatorio ( 1 , 5 ))) ,
NuevaColumna ( "Atributo 2" , Numérico , Continuo , Fórmula ( Entero aleatorio ( 0 , 10 ))) ,
Agregar filas ( 20 )
) ;
dt3 = NuevaTabla ( "Tabla 3" ,
NuevaColumna ( "IDENTIFICACIÓN" , Numérico , continuo , Fórmula ( Entero aleatorio ( 1 , 11 ))) ,
NuevaColumna ( "Atributo 3" , Numérico , Continuo , Fórmula ( Entero aleatorio ( 0 , 100 ))) ,
Agregar filas ( 30 )
) ;
// Función de utilidad:
// Dada una tabla de datos, una columna en ella y algunos valores en esa columna, selecciona todas las filas correspondientes.
// Es necesario permitir que 'col' sea numérico (carácter), en cuyo caso 'vals' es una matriz (es una lista).
seleccionar filas coincidentes =
Función ({ dt , columna , vals } ,
filas2seleccionar = [] ;
si ( esMatrix ( vals ) ,
// 'col' es numérico
Para ( i = 1 , i <= Fila N ( vals ) , i ++,
filas2seleccionar = VConcat ( filas2seleccionar , dt << ObtenerFilasDónde ( columna == vals [ i ])) ;
)
,
// 'col' es el caracter
Para ( i = 1 , i <= Nartículos ( vals ) , i ++,
filas2seleccionar = VConcat ( filas2seleccionar , dt << ObtenerFilasDónde ( columna == vals [ i ])) ;
)
) ;
dt << Seleccionar filas ( filas2seleccionar ) ;
) ;
// Cree un controlador de estado de fila para asignarlo a la tabla 'maestra' (dt1). Permitir múltiples selecciones de filas.
propagateSelectionToOtherTables =
Función ({ X } ,
// Obtener las filas que han sido seleccionadas
filas seleccionadas = dt1 << Obtener filas seleccionadas ;
Si ( Fila N ( filas seleccionadas ) > 0 ,
// Obtener las identificaciones correspondientes
identificaciones = dt1 : IDENTIFICACIÓN [ filas seleccionadas ] ;
// Selecciona las filas correspondientes en dt2
seleccionar filas coincidentes ( dt2 , exp. ( : IDENTIFICACIÓN ) , identificaciones ) ;
// Selecciona las filas correspondientes en dt3
seleccionar filas coincidentes ( dt3 , exp. ( : IDENTIFICACIÓN ) , identificaciones ) ;
,
// Borrar cualquier selección existente
dt2 << BorrarSeleccionar ;
dt3 << BorrarSeleccionar ;
) ;
) ;
// Asignar el controlador a dt1
rsh = dt1 << HacerRowStateHandler ( propagateSelectionToOtherTables ) ;
Re: ¿De qué manera sería posible aplicar el mismo filtro de datos a varias tablas de forma dinámica?He encontrado una forma mucho más eficiente de lidiar con el problema que mi enfoque original.
Para transferir el estado de fila (incluido y seleccionado) de dtglobal a dt1, dt2, dt3, puede usar lo siguiente, funciona rápido y dinámico incluso para tablas de datos grandes. Todo lo que necesita es una columna con una 'clave' correspondiente (valor numérico) en cada tabla.
//Transfiere el estado de la fila de dtglobal a otras tablas
controlador de estado = dtglobal << Crear controlador de estado de fila (transferencia de estado);
transferencia de estado = Función ({Y},
dt1 << borrar estados de fila;
dt2 << borrar estados de fila;
dt3 << borrar estados de fila;
excluirfilas = dtglobal << obtener filas excluidas;
includekeys = dtglobal:Key << obtener valores;
teclas de exclusión = teclas de exclusión [filas de exclusión];
dt1 << Seleccione Dónde (Contiene (Matriz (excluir claves),: Clave));
dt1 << excluir;
dt2 << Seleccione Dónde (Contiene (Matriz (excluir claves),: Clave));
dt2 << excluir;
dt3 << Seleccione Dónde (Contiene (Matriz (excluir claves),: Clave));
dt3 << excluir;
selectrows = dtglobal << obtener filas seleccionadas;
selectkeys = dtglobal:Key << obtener valores;
selectkeys = selectkeys[selectrows];
dt1 << Seleccione Dónde (Contiene (Matriz (teclas de selección),: Clave));
dt2 << Seleccione Dónde (Contiene (Matriz (teclas de selección),: Clave));
dt3 << Seleccione Dónde (Contiene (Matriz (teclas de selección),: Clave));
)
;
Re: ¿De qué manera sería posible aplicar el mismo filtro de datos a varias tablas de forma dinámica?Gracias por tu respuesta PMroz.
He estado experimentando con algo similar a este ejemplo: http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646 .
He creado dos tablas en las que el estado de inclusión/exclusión de la tabla 2 depende del de la tabla 1 (en el futuro esto podría ampliarse para incluir también otros estados como seleccionado, visible, color, etc.).
Desafortunadamente, el resultado aún no es sólido. A veces funciona, pero después de filtrar (incluir/excluir) un par de filas o hacer otra cosa, deja de funcionar. Sospecho que podría estar relacionado con la tabla de datos actual, pero no estoy seguro. Usar la secuencia de comandos que escribí desde la ventana de la secuencia de comandos (y no incrustada en la tabla 1) es un poco más sólida, pero a veces no logra hacer nada.
¡Cualquier idea sobre cómo mejorar aún más este enfoque es muy apreciada!
Simplemente ejecute el script para las dos tablas en el archivo adjunto para echar un vistazo por sí mismo. El script que uso para conectar las tablas también se encuentra en la parte inferior del archivo adjunto.
Breve resumen:
Tanto la tabla 1 como la tabla 2 tienen una columna RepID.
Si se incluye/excluye una fila en la Tabla 1, la columna :Excluido hace esto (por alguna razón, la referencia dt/dt2 se pierde después de lanzar las tablas, así que la defino aquí nuevamente):
Fórmula(
Si (excluido (estado de fila (fila ())),
dt = Tabla de datos ("linktable1.jmp");
dt2 = Tabla de datos ("linktable2.jmp");
Tabla de datos actuales (dt);
1;
,
dt = Tabla de datos ("linktable1.jmp");
dt2 = Tabla de datos ("linktable2.jmp");
Tabla de datos actuales (dt);
0;
)
)
),
Entonces la columna: analizador hace esto:
If(:Excluido == 1, Eval(Parse(:ScriptEx)), :Excluido == 0, Eval(Parse(:ScriptInc)))
Que se refiere a este script (en: ScriptEx):
RepIDex = dt:RepID[];
Lista de exclusión = Lista ();
Excludelist = As List( dt2 << Obtener filas Donde( dt2:RepID == RepIDex ) );
Tabla de datos actuales (dt2);
Eval( For( i = 1, i <= N Elementos( Excludelist ), i++, Row State( Excludelist ) = Estado Excluido( 1 ) ) );
Ver archivo adjunto para todo el script inc. mesas.
Re: ¿De qué manera sería posible aplicar el mismo filtro de datos a varias tablas de forma dinámica?No sé si podría filtrar cosas simultáneamente, pero podría agregar columnas de bandera a cada tabla, donde un 1 significa que esta fila cumple con algunos criterios y un 0 significa que no.