¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Hola a todos,
Tengo un script que hice para centrar una columna de datos mediante una columna de agrupación:

Ahora mismo solo respeta una columna centrada, pero me gustaría poder incluir varias. ¿Alguna guía para que la fórmula sea más dinámica? Actualmente, solo la uso para crear una nueva columna y luego añado manualmente las columnas adicionales a las que centrar.
Names Default To Here( 1 );
dt = current data table();
results = Column Dialog(src=ColList("Cols to be centered", Min Col(1)),trg = ColList("centered by", Min Col(1)));
for(i=1, i<= n items(eval(results[1])), i++,
ts=expr(dt << New Column( "cent col", "Numeric",Formula(Expr(Eval( results[1] )[i]) - Col Mean( Expr(Eval( results[1] )[i]), Expr(Eval( results[2] )[1]) ))));
eval(eval expr(TS));
ts=expr(dt:"cent col"n<<SET name=""></SET>
<P>¡Gracias por cualquier aportación!</P>
<BR />
<BR /><LINGO-LABS id="lingo-labs-869624" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatización y scripting</LINGO-LABEL></LINGO-LABS>Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Centrar columnas: esto es necesario con mucha frecuencia. Existen cientos de combinaciones para centrar (dividir o restar) y calcular la referencia:

Puedes consultar https://marketplace.jmp.com/appdetails/Normalization+GUI : añade una interfaz gráfica de usuario al menú de JMP para que funcione automáticamente. También funciona si se excluyen filas.
Si quieres configurarlo tú mismo, la idea básica es manipular las expresiones paso a paso.
Por ejemplo, utilice Insertar en para agregar un número dinámico de columnas de agrupación:
For Each( {groupByCol, idx}, currentGroupCols,
Insert Into( secondArgumentDirect, Name Expr( As Column( dt, groupByCol ) ) )
);Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?¿Quieres decir que deseas agregar más columnas de agrupación?
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
mean_expr = Expr(Col Mean());
Insert Into(mean_expr, NameExpr(src));
For Each({trg}, trgs,
colname = colname || " " || (trg << get name);
Insert Into(mean_expr, NameExpr(trg));
);
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(mean_expr),
));
);
Opcionalmente, también puede dejar que JMP haga más de esto utilizando Nueva columna de fórmula y cambiando los nombres después
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
res = dt << New Formula Column(
Operation(Category("Distributional"), "Center"),
Columns(srcs),
Group By(trgs)
);Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Gracias @hogi . Tendré que añadir ese complemento.
Ah, "Insertar en", esa parece ser la solución (ya que @jthi también entra).
Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Hola @jthi ,
Sí, se podrían añadir más columnas de agrupación, ¡y el primer script es perfecto! ¡Gracias por la ayuda!
Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Una opción también es usar Sustituir para reemplazar alguna expresión con Col Mean Usando una lista de columnas en fórmulas .
Aquí tienes un ejemplo sencillo con tus datos.
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
l = Insert(trgs, Name Expr(src), 1);
f = Substitute(l, Expr(List), Expr(Col Mean()));
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(f),
));
);
Sólo una nota: yo crearía el cuadro de diálogo usando Nueva ventana en lugar de usar Diálogo de columna, ya que brinda mucha más flexibilidad incluso en casos bastante simples.
Re: ¿Cómo hacer una fórmula que pueda aceptar un número variable de columnas de entrada?Gracias @jthi por las opciones agregadas.
Sí, este era un script antiguo en el que no había cambiado al uso de una nueva ventana, así que ahora he corregido ese mal hábito.