Pila de columnas basadas en la selección de expresiones regulares<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy apilando constantemente cientos de columnas que tienen prefijos comunes y terminan con un número o sufijo diferente.
Lo que me gustaría hacer es escribir un script para:
- Encuentre columnas basadas en un patrón de expresiones regulares, por ejemplo, "BLUE_CARS_*_\d{1,2}", "HOMES_(SINGLE|DOUBLE)_WIDE", etc.
- Seleccione esas columnas
- Apile las columnas (y colóquelas en una nueva hoja de datos)
Por mi vida, no puedo encontrar (o buscar en Google correctamente) cómo usar expresiones regulares con la selección de columnas.
Consideré seleccionar las columnas por tipo de datos, pero hay otras columnas presentes que comparten ese tipo de datos, no para
mencionar que quiero algo mucho más flexible.
Cualquier sugerencia o fragmento de código sería inmensamente apreciado y gracias de antemano.
Re: Pila de columnas basadas en la selección de expresiones regularesEl show () y los detalles sobre lo que estaba sucediendo me ayudaron a ver que en realidad le estábamos diciendo que usara un nombre de columna, no la columna real; supongo que tiene sentido ya que nc = dt << obtener nombres de columna;< /code> se utilizó en primer lugar. Entonces, en lugar de
cname = nc << obtener nombre;
Nosotros necesitabamos
cname = columna(nc ) << obtener nombre;
Supongo que por defecto get column names() devuelve las cadenas, no una lista de las columnas. Ah, bueno, está funcionando como se esperaba ahora.
¡Gracias por la ayuda!
Re: Pila de columnas basadas en la selección de expresiones regularesmostrar( yo, nc );
mostrará los valores actuales de las dos variables.Deslice eso después del incremento "i++" en el ciclo.nc *debería* mostrarse como una lista (entre llaves) de nombres de columnas.el mensaje <<
Verifique el registro después de ejecutarlo con el comando show y vea qué está mal.
Los objetos programables en JMP son objetos que entienden mensajes.Una variable podría contener una matriz, una lista o un número, que no son objetos programables, o la variable podría contener un cuadro de visualización, una tabla de datos o una columna, que son objetos programables.También hay muchos otros tipos, algunos programables, otros no.
Mi conjetura es que el complemento no elige explícitamente la tabla de datos, y los errores caen en cascada desde allí.Es posible que necesite otro show () antes de este.
craig
Re: Pila de columnas basadas en la selección de expresiones regularesTengo problemas para convertir este código en un complemento JMP (con un botón). El código funciona muy bien cuando lo ejecuto desde el editor de secuencias de comandos, pero cuando intento ejecutarlo como un complemento, da la siguiente queja:
Send Expects Scriptable Object en acceso o evaluación de 'Send', nc<I> << /*###*/obtener nombre/*###*/</I>
For( i = 1, i <= N Items( nc ), i++, cname = nc<I> << /*###*/get name/*###*/; model = nc<I> << get modeling type;</I></I>
Si cambio la primera línea para leer, cname = dt << obtener nombre(nc<I> );</I> pasa a quejarse de la siguiente línea.
Luego cambio esta línea para leer, modelo = dt << obtener el tipo de modelado (nc<I> );</I> y pasa a una función sort(), cambiando el error:
<CODE> Enviar espera un objeto programable en acceso o evaluación de 'Enviar', transpuesto <<SPAN style="font-family: arial, helvetica, sans-serif;"> y el codigo dice</SPAN>
transposed = transposed << /*###*/ sort(replace table, by("Row 1"), order(Descending))/*###*/;<BR /><SPAN style="font-family: arial, helvetica, sans-serif;">¿Alguna idea sobre cómo puedo resolver esto y hacerlo portátil (que funcione tanto en el editor como en un complemento sin problemas)? Mis disculpas por lo poco claro que esto puede parecer.</SPAN>
(Vaya, ¿por qué no hay un botón de vista previa de mensajes...).
Re: Pila de columnas basadas en la selección de expresiones regularesY sí, dejé algunas funciones de presentación en el JSL porque son ayudas útiles para la depuración.Sáquelos cuando haya terminado para que el registro no esté lleno de respuestas antiguas a preguntas antiguas.
craig
Re: Pila de columnas basadas en la selección de expresiones regularesbienvenido, graciasUtilice una tabla de datos explícita siempre que sea posible:
dtstacked = dt << Pila(
columnas (icoles),
Columna de etiqueta de origen ("Etiqueta"),
Columna de datos apilados ("Datos")
);
dtstacked hará referencia a la tabla de datos que resulta de dt<
Re: Pila de columnas basadas en la selección de expresiones regulares¡Excelente! Eso es exactamente lo que necesitaba.
Todavía me estoy familiarizando con la sintaxis jsl y la necesidad de 'mostrar' todo.
Y para la función Regex(), no pude encontrar ninguna documentación sobre el uso fuera de una función de columna normal, por lo que es útil que funcione de la misma manera. Esto resultará útil de muchas maneras.
Relacionado, ¿cómo me aseguraría de tener la nueva tabla/ventana seleccionada para usar en el resto de un script?
Además, definitivamente tuve que desactivar la traducción, porque estaba estropeando el código.
¡Gracias!
Re: Pila de columnas basadas en la selección de expresiones regularesEs posible que deba desactivar la casilla de verificación de traducir en la parte superior de la pantalla para ver el JSL correctamente.
Re: Pila de columnas basadas en la selección de expresiones regularesAlgo como esto.
dt = Abrir( "$sample_data/big class.jmp" );
allCols = dt << getcolumnnames;
Mostrar (todas las columnas); // estos son nombres, no cadenas
acoles = {}; // columnas con "a" en su nombre
iconos = {}; // columnas con "i" en su nombre
n = N elementos (todas las columnas);
Para( k = 1, k <= n, k++,
cname = todas las columnas << obtener nombre; // estas son cadenas, buenas para expresiones regulares
Mostrar (cname);
If( !Falta( Regex(cname, "a" ) ),
Insertar en( acols, allCols) // mantener los nombres
);
If( !Falta( Regex(cname, "i" ) ),
Insertar en (icolas, todas las columnas) // mantener los nombres
);
);
Mostrar( acoles, icolas ); // {:nombre, :edad} y {:altura, :peso}
dt << Pila(
columnas (icoles),
Columna de etiqueta de origen ("Etiqueta"),
Columna de datos apilados ("Datos")
);
