<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Con frecuencia me surge la pregunta de cómo escribir una fórmula (aplicar la misma fórmula a varias columnas, usando algo sobre la columna de referencia en la fórmula). Este suele ser un lugar de entrada para que las personas también comiencen a crear scripts, por lo que son novatos.
Recientemente publiqué una pregunta en la sección de discusión regular, tratando de lograr que mi cliente participara (no lo hicieron) y algunos consejos de expertos (cualquiera que lea esto). Realmente me gustaría generar una respuesta sólida que pudiera señalar a la gente cuando surja esta pregunta. Por ejemplo, ¿la respuesta sugerida es realmente la mejor manera de hacerlo si tiene más de 1000 columnas, etc.?
Cualquier ayuda en esto sería apreciada. O una entrada de blog. ¿O señalar que esto se ha cubierto en otro lugar?
La discusión regular está aquí:
¿La mejor manera de escribir una fórmula de columna en muchas columnas?
¡Gracias!
Como continuación de lo anterior: notará que uso la función: Name () para los nombres de las columnas. Esto ayuda a evitar problemas derivados de tener caracteres interesantes en los nombres de las columnas. No siempre es necesario, pero de nuevo, a prueba de balas.
Siguiendo con lo que dijo Don, a menudo me doy un paso más allá, usando Eval (Parse (Substitute ())).
Esto es, en efecto, escribir el código de forma dinámica. Aunque algo poco elegante, es casi a prueba de balas. Esta construcción no siempre es la más eficiente (debido a las sustituciones de caracteres), pero es la que tiene éxito cuando fallan todos los demás trucos, por lo que es bueno conocerla. El inconveniente más importante es que no puede ver el código de colores debido a las citas:
Nombres predeterminados aquí ( 1 ) ;
dt = abierto ( "$ Sample_Data / football.jmp" ) ;
codeFrag = "\ [
Nueva columna ("_colName_ Rango de la media",
Numérico,
"Continuo",
Formato ("Mejor", 12),
Fórmula (Col Rank (Abs (Col Mean (: Name ("_colName_")) -: Name ("_colName_"))))
)
] \ " ;
colList = dt << getcolumnnames ( cuerda ) ;
para ( yo = 1 , yo <= nitems ( collist ) , yo ++,
Si ( columna ( dt , colList [ yo ]) << obtener el tipo de modelado == "Continuo" ,
eval ( analizar gramaticalmente ( sustituir ( codeFrag , "_colName_" , colList [ yo ])))
)
) ;
Si le molesta la falta de codificación de colores, puede mantenerla envolviendo la cadena en una construcción char (nameexpr ()), como se muestra a continuación. Esto agrega complejidad, pero puede valer la pena al escribir el código con fines de depuración ... una vez que funcione, siempre puede eliminar la pieza char (nameexpr ()) y colocarla entre comillas usando "\ [] \".
En pocas palabras: esto no ganará un concurso de belleza, pero cuando usted mismo escriba la cadena, la analice y la evalúe, obtendrá lo que busca. Mantenga esto en su bolsillo trasero para cuando Eval (EvalExpr (...... Expr () ....)) falla y no puede averiguar (o no tiene tiempo para averiguarlo, o no le importa) por qué.
Nombres predeterminados aquí ( 1 ) ;
dt = abierto ( "$ Sample_Data / football.jmp" ) ;
codeFrag = carbonizarse ( nameexpr (
Nueva columna ( "_colName_ Rango de media" ,
Numérico ,
"Continuo" ,
Formato ( "Mejor" , 12 ) ,
Fórmula ( Rango Col ( Abdominales ( Col media ( : Nombre ( "_colName_" )) - : Nombre ( "_colName_" ) ) ) )
)
)) ;
colList = dt << getcolumnnames ( cuerda ) ;
para ( yo = 1 , yo <= nitems ( collist ) , yo ++,
Si ( columna ( dt , colList [ yo ]) << obtener el tipo de modelado == "Continuo" ,
eval ( analizar gramaticalmente ( sustituir ( codeFrag , "_colName_" , colList [ yo ])))
)
) ;
Salud,
Brady
Laura
Creo que la respuesta dada en el Foro es un enfoque sólido que no complica el código más de lo necesario. Creo que el uso de Expr y Name Expr es inevitable en esta situación. Como siguiente paso, podría considerar eliminar la fórmula del ciclo para hacer que el código sea más genérico. De esta manera, puede crear una función que tome fórmulas como argumento (ver JSL adjunto). Probablemente haya una forma más sencilla de hacer esto, pero estoy tan acostumbrado a usar Substitute (y es extremadamente robusto). No estoy seguro de por qué se necesita la parte [Row ()], pero es para cualquier momento en el que haga referencia a una columna, excepto dentro de una función de columna estadística. Espero que esto proporcione una idea.
Don