JSL: creación de fórmula utilizando un nombre de columna variableHola,
Quiero hacer algo realmente simple (al menos eso pensé), es decir, crear una nueva columna usando JSL con una fórmula que contenga un nombre de columna variable. Ya probé varias combinaciones de los comandos "columna, como columna, nombre, como nombre, eval, parse.." y busqué en el foro, pero todo lo que probé da como resultado un error de que no se pudo evaluar la fórmula.
Un ejemplo de lo que quiero hacer:
La "columna 1" es una columna de mi tabla de datos.
a = "column 1";
new column("test", formula(a*2));
La columna "prueba" debe contener la fórmula que multiplica la "columna 1" por 2.
Gracias por cualquier ayuda,
dalia
Re: JSL: Crear fórmula usando un nombre de columna variableDespués de intentar encontrar una solución que funcionara, finalmente me di por vencido y le pregunté al soporte de JMP cómo se podía hacer. Wendy amablemente me mostró las líneas clave y las incorporé en un bucle for como demostración. El código que incluyo supone que la tabla de datos actual tiene 2 columnas denominadas abc y def que tienen algunas filas de datos de su elección. Por cierto, existe un nuevo libro de SAS Press llamado Jump into JMP Scripting de Wendy Murphrey y Rosemary Lucas, que es un libro muy útil sobre scripting. Cubre Expr y Eval Expr utilizados en el ejemplo.
dt = Current Data Table();
cols = {abc, def};
nlist = N Items(cols);
For( i = 1, i <= nlist, i++,
newColExpr = Expr(
dt << New Column( char(cols[i])||"*2", Numeric, Formula( Expr( cols[i] ) * 2 ) )
);
Eval( Eval Expr( newColExpr ) );
)Re: JSL: Creación de una fórmula usando un nombre de columna variableA veces las cosas más simples pueden ser alucinantes en JSL 
A continuación se presentan un par de enfoques:
new column("test",formula( as column("column 1")*2 ));
o
a = "column 1";
new column("test",formula( a[]*2 ));
La lógica de la sintaxis es similar a la siguiente. En el primer ejemplo, queremos tratar la "columna 1" como una columna de números. En el segundo ejemplo, "[]" indica que a es un array de números.
Espero que esto ayude
Re: JSL: Creación de una fórmula usando un nombre de columna variableGracias por la respuesta, pero desafortunadamente no ayuda.
El primer enfoque no es lo que quería porque necesito quitar el nombre de la columna de una variable (puede cambiar).
El segundo método no funciona, ya que JMP no inserta el nombre real de la columna en la fórmula. Si abres el cuadro de diálogo para cambiar la fórmula, verás "a[Empty()] * 2" en tu sugerencia, y necesito algo como ":Column1 * 2".
¿Alguna otra sugerencia?Re: JSL: Creación de una fórmula usando un nombre de columna variableCreo que mi segundo ejemplo debería haberse leído así:
a = Column("column 1");
new column("test",formula( a[]*2 ));
Re: JSL: Creación de una fórmula usando un nombre de columna variable@mpb: ¡Eso funciona perfectamente! ¡Gracias por descubrirlo y por el consejo del libro!Re: JSL: Creación de una fórmula usando un nombre de columna variable¡Gracias, funciona!Re: JSL: Creación de una fórmula usando un nombre de columna variableTodavía tengo una pregunta adicional:
Lo que finalmente quiero hacer es crear una nueva columna para cada elemento de una lista. En la solución de Stig, la fórmula de la columna aún depende de la variable "a[]" y no (como preferiría) del nombre de la columna "Columna 1", por lo que no puedo cambiar "a[]" en el siguiente script sin cambiar también los valores calculados de la columna. Esto significa que mi siguiente enfoque no funciona (la longitud de la lista de columnas y los nombres de las columnas pueden cambiar, por lo que necesito un bucle):
collist = {"column 1", "column 2"};
for (k=1, k<=length(collist), k++,
a = Column(collist);
new column(concat("test",char(k)), formula( a[]*2 ));
);
Insertar directamente un elemento de lista en la instrucción formula() tampoco funciona. ¿Alguien tiene alguna otra sugerencia?
Dalia
Re: JSL: Creación de una fórmula usando un nombre de columna variableSi uso el siguiente código:
dt = Current Data Table();
a = Column("height");
dt << New Column("test1",formula(a[]*2));
a = Column("weight");
dt << New Column("test2",formula(a[]*2));
Ambas columnas, test1 y test2, se calculan correctamente, aunque la fórmula para ambas hace referencia a la misma variable a. Por lo tanto, en principio, no debería haber problemas con el código dentro de un bucle. Sin embargo, este enfoque no funciona si se desea que las nuevas columnas conserven su comportamiento en la tabla como columnas calculadas, lo que deja abierta la pregunta de cómo generar desde el código una columna con la fórmula ":column 1 * 2"...
Re: JSL: Creación de una fórmula usando un nombre de columna variableOh, recién ahora veo que mi publicación anterior no se mostró completamente... Lo siento por eso.
Sí, necesito que las columnas conserven su comportamiento o al menos sus valores. Por eso se me ocurrió eliminar las fórmulas justo después de calcularlas. Pero no encontré una instrucción que hiciera lo mismo que "Fórmula... -> Borrar", es decir, eliminar la fórmula y conservar los valores. ¿Alguien sabe cómo funciona esto?
Esa no sería la mejor solución, pero por ahora me basta.Re: JSL: Creación de una fórmula usando un nombre de columna variableAhora hice la solución alternativa para leer los valores de la columna en un vector y escribir los valores calculados en una nueva columna.
Pero todavía estoy interesado en las respuestas a las preguntas abiertas.
Dalia