<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je reçois souvent la question de savoir comment écrire une formule (appliquer la même formule à plusieurs colonnes, en utilisant quelque chose à propos de la colonne de référence dans la formule). C'est généralement un point d'entrée pour que les gens commencent à écrire des scripts, ils sont donc novices.
J'ai récemment publié une question dans la section de discussion régulière, en essayant à la fois de faire participer mon client (ils ne l'ont pas fait) et de donner des conseils d'experts (quiconque lisant ceci). J'aimerais vraiment générer une réponse solide que je pourrais indiquer aux gens lorsque cette question se posera. Par exemple, la réponse suggérée est-elle vraiment la meilleure façon de le faire si vous avez plus de 1000 colonnes, etc.?
Toute aide à ce sujet serait appréciée. Ou une entrée de blog. Ou en soulignant que cela a été couvert ailleurs?
La discussion régulière est ici:
La meilleure façon de créer un script d'une formule de colonne en plusieurs colonnes?
Merci!
Comme suite à la précédente: vous remarquerez que j'utilise la fonction: Name () pour les noms de colonnes. Cela permet d'éviter tout problème lié à la présence de caractères intéressants dans les noms de colonnes. Pas toujours nécessaire, mais encore une fois, à l'épreuve des balles.
Suite à ce que Don a dit, je me surprends souvent à aller plus loin, en utilisant Eval (Parse (Substitute ())).
Il s'agit en fait d'écrire le code de manière dynamique. Bien que quelque peu inélégant, il est presque à l'épreuve des balles. Cette construction n'est pas toujours la plus efficace (en raison des substitutions de caractères), mais c'est celle qui réussit lorsque toutes les autres astuces échouent, il est donc bon d'en savoir plus. L'inconvénient le plus important est que vous ne pouvez pas voir le code couleur en raison de la citation:
Noms par défaut ici ( 1 ) ;
dt = ouvert ( "$ Sample_Data / football.jmp" ) ;
codeFrag = "\ [
Nouvelle colonne ("_colName_ Rank from mean",
Numérique,
"Continu",
Format ("Meilleur", 12),
Formule (Col Rank (Abs (Col Mean (: Name ("_colName_"))) -: Name ("_colName_"))))
)
] \ " ;
colList = dt << getcolumnnames ( chaîne ) ;
pour ( je = 1 , je <= nitems ( colliste ) , je ++,
si ( colonne ( dt , colList [ je ]) << obtenir le type de modélisation == "Continu" ,
évaluer ( analyser ( remplacer ( codeFrag , "_colName_" , colList [ je ])))
)
) ;
Si le manque de code couleur vous dérange, vous pouvez le maintenir en enveloppant la chaîne dans une construction char (nameexpr ()), comme ci-dessous. Cela ajoute de la complexité mais cela peut valoir la peine d'écrire le code à des fins de débogage ... une fois que cela fonctionne, vous pouvez toujours supprimer le morceau char (nameexpr ()) et le placer entre guillemets en utilisant "\ [] \".
En bout de ligne: cela ne gagnera pas un concours de beauté, mais lorsque vous écrivez vous-même la chaîne, l'analysez et l'évaluez, vous obtiendrez ce que vous recherchez. Gardez-le dans votre poche arrière lorsque Eval (EvalExpr (...... Expr () ....)) échoue et vous ne pouvez pas comprendre (ou n'avez pas le temps de comprendre, ou ne vous en souciez pas) pourquoi.
Noms par défaut ici ( 1 ) ;
dt = ouvert ( "$ Sample_Data / football.jmp" ) ;
codeFrag = carboniser ( nomexpr (
Nouvelle colonne ( "Classement de _colName_ par rapport à la moyenne" ,
Numérique ,
"Continu" ,
Format ( "Meilleur" , 12 ) ,
Formule ( Col Rank ( Abdos ( Col Mean ( : Nom ( "_colName_" )) - : Nom ( "_colName_" ) ) ) )
)
)) ;
colList = dt << getcolumnnames ( chaîne ) ;
pour ( je = 1 , je <= nitems ( colliste ) , je ++,
si ( colonne ( dt , colList [ je ]) << obtenir le type de modélisation == "Continu" ,
évaluer ( analyser ( remplacer ( codeFrag , "_colName_" , colList [ je ])))
)
) ;
À votre santé,
Brady
Laura,
Je pense que la réponse donnée dans le Forum est une approche solide qui ne complique pas plus le code que nécessaire. Je pense que l'utilisation d'Expr et de Name Expr est inévitable dans cette situation. Dans l'étape suivante, vous pouvez envisager de supprimer la formule de la boucle pour rendre le code plus générique. De cette façon, vous pouvez créer une fonction qui prend des formules comme argument (voir JSL joint). Il existe probablement un moyen plus simple de le faire, mais je suis tellement habitué à utiliser Substitute (et c'est extrêmement robuste). Je ne sais pas pourquoi la partie [Row ()] est nécessaire, mais c'est pour chaque fois que vous faites référence à une colonne sauf dans une fonction de colonne statistique. J'espère que cela donne un aperçu.
Don