Empiler des colonnes en fonction de la sélection de regex<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'empile constamment des centaines de colonnes qui ont des préfixes communs et se terminent par un numéro ou un suffixe différent.
Ce que je voudrais faire, c'est écrire un script pour:
- Trouvez des colonnes basées sur un modèle de regex, par exemple "BLUE_CARS_*_\d{1,2}", "HOMES_(SINGLE|DOUBLE)_WIDE", etc.
- Sélectionnez ces colonnes
- Empilez les colonnes (et placez-les dans une nouvelle feuille de données)
Pour ma vie, je ne peux pas trouver (ou rechercher correctement sur Google) comment utiliser regex avec sélection de colonnes.
J'ai envisagé de sélectionner les colonnes par type de données, mais il existe d'autres colonnes présentes qui partagent ce type de données, pas pour
mentionner que je veux quelque chose de beaucoup plus flexible.
Toute suggestion ou extrait de code serait extrêmement apprécié et merci d'avance.
Re : Empiler des colonnes en fonction de la sélection de regexLe show() et les détails sur ce qui se passait m'ont aidé à voir que nous lui disions en fait d'utiliser un nom de colonne, pas la colonne réelle - je suppose que cela a du sens puisque nc = dt << get column names;< /code> a été utilisé en premier lieu. Ainsi, au lieu de
cname = nc<I> << obtenir le nom ;</I>
Nous avions besoin
cname = colonne(nc<I> ) << obtenir le nom ;</I>
Je suppose que par défaut get column names() renvoie les chaînes, pas une liste des colonnes. Ah, eh bien, ça marche comme prévu maintenant.
Merci pour l'aide!
Re : Empiler des colonnes en fonction de la sélection de regexshow( je, nc );
affichera les valeurs actuelles des deux variables.Glissez-le après le "i++", incrémentez-le dans la boucle.nc *devrait* s'afficher sous forme de liste (entre accolades) de noms de colonnes.le message <<
Vérifiez le journal après l'avoir exécuté avec la commande show et voyez ce qui ne va pas.
Les objets inscriptibles dans JMP sont des objets qui comprennent les messages.Une variable peut contenir une matrice, une liste ou un nombre, qui ne sont pas des objets scriptables, ou la variable peut contenir une zone d'affichage, une table de données ou une colonne, qui sont des objets scriptables.Il existe également de nombreux autres types, certains scriptables, d'autres non.
Je suppose que la table de données n'est pas explicitement choisie par le complément et que les erreurs se succèdent à partir de là.Vous pourriez avoir besoin d'un autre show() avant celui-ci.
Craig
Re : Empiler des colonnes en fonction de la sélection de regexJe rencontre des problèmes pour transformer ce code en complément JMP (avec un bouton). Le code fonctionne très bien lorsque je l'exécute à partir de l'éditeur de script, mais lorsque j'essaie de l'exécuter en tant que complément, il donne la plainte suivante :
Envoyer attend un objet inscriptible dans l'accès ou l'évaluation de 'Send' , nc<I> << /*###*/obtenir le nom/*###*/</I>
For( i = 1, i <= N Items( nc ), i++, cname = nc<I> << /*###*/get name/*###*/; model = nc<I> << get modeling type;</I></I>
Si je change la première ligne pour lire, cname = dt << obtenir le nom (nc<I> );</I> il passe à se plaindre de la ligne suivante.
Je change ensuite cette ligne pour lire, modèle = dt << obtenir le type de modélisation (nc<I> );</I> et il passe à une fonction sort(), changeant l'erreur :
<CODE> Send attend un objet scriptable dans l'accès ou l'évaluation de 'Send' , transposé <<SPAN style="font-family: arial, helvetica, sans-serif;"> et le code lit</SPAN>
transposed = transposed << /*###*/ sort(replace table, by("Row 1"), order(Descending))/*###*/;<BR /><SPAN style="font-family: arial, helvetica, sans-serif;">Des idées sur la façon dont je peux résoudre ce problème et le rendre portable (fonctionner à la fois dans l'éditeur et en tant que complément sans problème) ? Mes excuses pour le peu de clarté que cela peut sembler.</SPAN>
(Wow, pourquoi n'y a-t-il pas de bouton de prévisualisation des messages...).
Re : Empiler des colonnes en fonction de la sélection de regexEt oui, j'ai laissé quelques fonctions show dans le JSL parce qu'elles sont des aides au débogage utiles.Retirez-les lorsque vous avez terminé afin que le journal ne soit pas encombré de vieilles réponses à de vieilles questions.
Craig
Re : Empiler des colonnes en fonction de la sélection de regexbienvenue, merci.Utilisez un tableau de données explicite dans la mesure du possible :
dtempilé = dt << Empiler(
colonnes ( icônes ),
Colonne d'étiquette source( "Étiquette" ),
Colonne de données empilées( "Données" )
);
dtstacked référencera la table de données qui résulte de dt<
Re : Empiler des colonnes en fonction de la sélection de regexSuper! C'est exactement ce dont j'avais besoin.
Je me familiarise toujours avec la syntaxe jsl et la nécessité de tout "montrer".
Et pour la fonction Regex(), je n'ai trouvé aucune documentation sur son utilisation en dehors d'une fonction de colonne régulière, donc c'est pratique, cela fonctionne de la même manière. Cela s'avérera utile à bien des égards.
En relation, comment m'assurer que la nouvelle table/fenêtre est sélectionnée pour être utilisée dans le reste d'un script ?
De plus, j'ai définitivement dû désactiver la traduction, car cela gâchait le code.
Merci!
Re : Empiler des colonnes en fonction de la sélection de regexVous devrez peut-être désactiver la case à cocher de traduction en haut de l'écran pour voir le JSL correctement.
Re : Empiler des colonnes en fonction de la sélection de regexQuelque chose comme ça.
dt = Open( "$sample_data/big class.jmp" );
allCols = dt << getcolumnnames;
Show( allCols ); // ce sont des noms, pas des chaînes
cols = {} ; // colonnes avec "a" dans leur nom
icônes = {} ; // colonnes avec "i" dans leur nom
n = N éléments( allCols );
Pour( k = 1, k <= n, k++,
cname = allCols << getname ; // ce sont des chaînes, bonnes pour les regex
Afficher( cname );
Si( !Is Missing( Regex( cname, "a" ) ),
Insérer dans( acols, allCols) // garde les noms
);
Si( !Is Missing( Regex( cname, "i" ) ),
Insérer dans( icols, allCols) // garde les noms
);
);
Show( acols, icols ); // {:name, :age} et {:height, :weight}
dt << Pile(
colonnes ( icônes ),
Colonne d'étiquette source( "Étiquette" ),
Colonne de données empilées( "Données" )
);
