optimiser une instruction IF ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai une liste de valeurs spécifiques que je souhaite identifier dans mon ensemble de données (valeurs spécifiques de la colonne :MeasurementGroup).J'ai créé une nouvelle colonne intitulée « Valeur de l'intérêt ? » avec une formule pour générer un indicateur : soit OUI, soit NON
dt1 << Nouvelle colonne( "Valeur de l'intérêt ?",
Personnage,
Nominal,
Formule ( Si (
:MeasurementGroup == "A", "OUI",
:MeasurementGroup == "B", "OUI",
:MeasurementGroup == "C", "OUI",
:MeasurementGroup == "D", "OUI",
:MeasurementGroup == "E", "OUI",
:MeasurementGroup == "F", "OUI",
:MeasurementGroup == "G", "OUI",
:MeasurementGroup == "AA", "OUI",
:MeasurementGroup == "BB", "OUI",
:MeasurementGroup == "CC", "OUI",
:MeasurementGroup == "ZZ", "OUI",
:MeasurementGroup == "ABC", "OUI",
:MeasurementGroup == "DEC", "OUI",
:MeasurementGroup == "WSA", "OUI",
:MeasurementGroup == "RSS", "OUI",
:MeasurementGroup == "DVC", "OUI",
:MeasurementGroup == "SFS", "OUI",
:MeasurementGroup == "AAZ", "OUI",
:MeasurementGroup == "ZZA", "OUI",
:MeasurementGroup == "TTT", "OUI",
"NON") )
);
Ma table de données contient près d'un million de lignes... et elle semble tourner un peu avant d'être remplie.Existe-t-il un moyen plus efficace d’obtenir ce même résultat ?
Toute aide est grandement appréciée! merci
Re : optimiser une instruction IF ?Merci Peter, j'utiliserai cette astuce à partir de maintenant lorsque je publierai.
Acclamations,
Brady
Re : optimiser une instruction IF ?Ça a l'air bien Brady !
BTW, lorsque je poste du code, je copie/colle le JSL dans un document Word, puis je copie/colle de là sur le forum.Cela préserve l'apparence de l'éditeur JSL.
Par exemple:
dt << Nouvelle colonne ( "o/n 2" ,
formule (
Contient ( { "UN" , "B" , "C" , "D" , "E" , "F" , "G" , "AA" , "BB" , "CC" , "ZZ" , "ABC" , "DÉC" , "WSA" ,
"RSS" , "DVC" , "SFS" , "AAZ" , "ZZA" , "TTT" } , : Groupe de mesures
) != 0
) ,
) ;
Re : optimiser une instruction IF ?Bonjour JMPDébutant,
**** Veuillez vous référer au fichier .jsl ci-joint pour voir ces scripts comme prévu. J'ai du mal à afficher correctement mes messages, et si vous copiez/collez ou tapez les scripts qui apparaissent ci-dessous, je ne suis pas sûr qu'ils fonctionneront. Ils semblent incorrects lorsque je les publie, mais ils semblent corrects lorsque je les modifie, donc je ne sais pas quoi faire à part joindre un fichier de script. Mes excuses!
*****
Si vous souhaitez utiliser des étiquettes de valeur (pour les grandes tables, cela peut également économiser beaucoup d'espace disque), vous disposez d'autres options rapides :
1) Une approche basée sur une formule utilisant la fonction Contains() :
dt << Nouvelle colonne( "o/n 2",
formule(
Contient(
{"A", "B", "C", "D", "E", "F", "G", "AA", "BB", "CC", "ZZ", "ABC", " DEC", "WSA", "RSS", "DVC", "SFS", "AAZ", "ZZA", "TTT"},
:Groupe de mesures
) != 0
),
<
);
2) Une approche non basée sur des formules : JMP travaille très rapidement avec les tableaux ; la rapidité de cette démarche m'a un peu choqué, étant donné qu'une toute nouvelle table doit être créée et fermée :
dt = Table de données actuelle ();
dt2 = Nouvelle Table( "mt", invisible );
Colonne (dt2, 1) << type de données (caractère) << définir le nom ( "MeasurementGroup" ) << définir les valeurs (
{"A", "B", "C", "D", "E", "F", "G", "AA", "BB", "CC", "ZZ", "ABC", " DEC", "WSA", "RSS", "DVC", "SFS", "AAZ", "ZZA", "TTT"}
);
dt2 << Nouvelle colonne( "o/n", <
dt << Nouvelle colonne( "o/n", <
dt << Mettre à jour (Avec ( dt2 ), Faire correspondre les colonnes ( :Measurement Group = :MeasurementGroup ), Ajouter des colonnes de la table de mise à jour (Aucun ) );
Column( dt, "o/n" ) << Ajouter des propriétés de colonne (value labels( {0, 1}, {"NO", "YES"} ) );
Fermer( dt2, nosave );
Sur une table d'un million de lignes, j'obtenais des durées d'exécution d'environ 2,4 secondes pour la fonction Match. (L'ordinateur de MS semble être plus rapide que le mien 
Les durées d'exécution de l'approche 1 ci-dessus étaient d'environ 0,8 seconde, tandis que les durées d'exécution de l'approche 2 étaient d'environ 0,4 seconde.
Acclamations,
Brady
Re : optimiser une instruction IF ?Jim, merci pour la réponse rapide! J'ai pu implémenter la fonction LOC et constater une amélioration immédiate de la vitesse !
MS, merci d'avoir amélioré cela davantage et de m'avoir appris la fonction MATCH (et fourni la comparaison de vitesse) !
Re : optimiser une instruction IF ?Donnez une récompense à cet homme !C'est bien.
Re : optimiser une instruction IF ?La fonction Match est efficace pour les choix multiples. J'ai fait un test rapide : avec un million de lignes Correspondre , Lieu et Si terminer en 2,1 secondes, 6,9 secondes et 10,2 secondes, respectivement.
dt << Nouvelle colonne ( "Valeur d'intérêt" ,
Personnage ,
Nominal ,
Formule (
Correspondre ( : Groupe de mesures ,
"UN" , "OUI" ,
"B" , "OUI" ,
"C" , "OUI" ,
"D" , "OUI" ,
"E" , "OUI" ,
"F" , "OUI" ,
"G" , "OUI" ,
"AA" , "OUI" ,
"BB" , "OUI" ,
"CC" , "OUI" ,
"ZZ" , "OUI" ,
"ABC" , "OUI" ,
"DÉC" , "OUI" ,
"WSA" , "OUI" ,
"RSS" , "OUI" ,
"DVC" , "OUI" ,
"SFS" , "OUI" ,
"AAZ" , "OUI" ,
"ZZA" , "OUI" ,
"TTT" , "OUI" ,
"NON"
)
)
) ;
Re : optimiser une instruction IF ?J'essaierais d'utiliser la fonction LOC()
if(N Rows(Loc({"A","B","C",...............},MeasurementGroup))>0,"Oui","NON" )