Equivalent à un Index(Match()) dans ExcelJ'ai des données pour lesquelles je voudrais calculer l'erreur en % entre la première et toutes les mesures suivantes pour chaque identifiant unique. Je n'ai pas réussi à comprendre comment obtenir des données d'une cellule en fonction des valeurs d'autres lignes-colonnes. Cela nécessite-t-il JSL ou puis-je simplement créer une formule comme je l'ai fait dans Excel.
J'aimerais que les 2 colonnes que j'ai mises en évidence soient calculées à l'aide d'une formule, mais avec des milliers de lignes de données dans l'ensemble réel, je pourrais comprendre s'il doit s'agir d'un script et que les valeurs soient statiques jusqu'à ce que le script soit à nouveau exécuté.

Toute aide serait appréciée.
J'utilise JMP 16.
Analyse et modélisation de données de baseRé: Équivalent à un index (Match()) dans ExcelVous pouvez obtenir la mesure la plus ancienne en utilisant Col Min(Row(), :ID)
:Measurement[Col Min(Row(), :ID)]
Vous pouvez ensuite l'utiliser dans une colonne séparée ou simplement l'utiliser comme partie d'une formule unique qui calculera votre résultat
Ré: Équivalent à un index (Match()) dans ExcelMerci, ça marche.
J’ai cependant une inquiétude : que se passerait-il si je voulais utiliser la 2e valeur pour chaque ID ?
Donc pour ID == A j'aurais 10,00001 dans la colonne « Mesure la plus ancienne ».
Ré: Équivalent à un index (Match()) dans ExcelIl existe un certain nombre d'options différentes, mais elles peuvent être un peu difficiles à comprendre. L'idée la plus « simple » est de combiner la fonction statistique Col avec l'instruction if et l'instruction if renvoie soit la valeur manquante, soit la valeur que vous recherchez.
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

L’avantage de l’utilisation des fonctions statistiques Col est qu’elles fonctionnent bien avec le regroupement de colonnes et sous forme de formules.
Ré: Équivalent à un index (Match()) dans ExcelLa méthode que je considère comme la plus « semblable à JMP » est la solution interactive et permet à JMP de créer un processus automatisé (en utilisant un générateur de journaux/flux de travail amélioré), puis de corriger les « problèmes » laissés par le script créé par JMP :
Comme vous avez déjà une colonne Order que je suppose que vous pouvez utiliser, créez un sous-ensemble de Order == 2. Clic droit -> sélectionnez les cellules correspondantes -> créez un sous-ensemble


À partir du sous-ensemble, renommez la colonne Mesure en quelque chose d'autre. Revenez ensuite à votre table d'origine et utilisez Mettre à jour pour joindre le sous-ensemble à votre table en utilisant l'ID comme colonne de condition de correspondance

et maintenant vous avez votre mesure à partir de l'ordre deux dans une colonne. Et JMP vous écrira un script comme celui-ci :
// Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
// Subset data table
// → Data Table("Subset of JMP Example")
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Copy formula(0), Selected Rows(1), Selected columns only(0));
// Change column name: Measurement → Measurement_ORDER2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement_ORDER2");
// Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
Ce n'est certainement pas le meilleur script, mais il fonctionne et donne une idée de ce qui est fait. Vous pouvez également démarrer l'enregistrement du flux de travail avant de démarrer ce processus et créer un flux de travail pour automatiser cela (personnellement, je n'utilise pas de flux de travail et je préfère le journal amélioré, mais ils peuvent être très utiles, surtout si vous souhaitez automatiser quelque chose). Le script créé par le générateur de flux de travail pourrait ressembler à ceci
Names Default To Here(1);
Workflow 6=function({},
step_name = "Open Data Table: JMP Example.jmp";
//Open Data Table: JMP Example.jmp
Open("$DOWNLOADS/JMP Example.jmp");
step_name = "Select matching cells";
//Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
step_name = "Subset data table";
//Subset data table
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Selected Rows(1), Selected columns only(0));
step_name = "Change column name: Measurement → Measurement2";
//Change column name: Measurement → Measurement2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement2");
step_name = "Update data table";
//Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement2),
Replace Columns in Main Table(None)
);
step_name = "Close Data Table: Subset of JMP Example";
//Close Data Table: Subset of JMP Example
Close(Data Table("Subset of JMP Example"), NoSave);
);
Workflow 6();
En général, les scripts créés par le générateur de workflow présentent des problèmes similaires à ceux créés par le journal amélioré, mais le workflow présente des avantages supplémentaires (si vous souhaitez les considérer comme tels, je les considère principalement comme une nuisance, s'il s'agit de choses très simples comme la mise à jour des références). Et voici comment je modifierais le script créé par JMP
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
dt << Clear Column Selection << Clear Select;
rows_of_interest = dt << Get Rows Where(:Order == 2);
dt_subset = dt << Subset(Rows(rows_of_interest),
Copy formula(0),
Selected columns only(0),
Invisible
);
Column(dt_subset, "Measurement") << Set Name("Measurement_ORDER2");
dt << Update(
With(dt_subset),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
Close(dt_subset, no save);
Ces opérations peuvent également être réalisées à l'aide de JSL "plus avancé", mais en général, si vous souhaitez utiliser des formules et éviter JSL, je ne les utiliserais pas. Le seul cas où vous pouvez les utiliser est si vous avez besoin de vitesse et même dans ce cas, elles peuvent parfois finir par être plus lentes à moins que vous ne les optimisiez. Voici une option utilisant JSL avec quelques commentaires pour expliquer
Voir plus...
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
// Get all IDs into a list using data table subscripting
ids = dt[0, "ID"];
// Get all unique IDs using Summarize (there are many other methods)
// Note that Summarize will change numeric values to strings (doesn't matter in this case)
Summarize(dt, uniq_ids = By(:ID));
// We can loop over the unique IDs while collecting results
// I will store results to Associative Array as it is efficient method and easy to access
aa_idpos = Associative Array();
aa_meas = Associative Array();
idx_of_interest = 2;
For Each({cur_id}, uniq_ids,
// We can use Loc to find specific ID from a list of IDs
cur_idx = Loc(ids, cur_id);
// From this we can pick second index for example and store it to our aa
// Note: Usually you want to check that there is at least two items if you do this
aa_idpos[cur_id] = cur_idx[2];
// You could also get the Measurement value instead
// (I prefer index as then I can access value from any of the columns easily)
aa_meas[cur_id] = :Measurement[cur_idx[idx_of_interest]];
);
// Show(aa_idpos);
// Then you can basically do whatever you want with these
// Fill them into the table for example by using Formula OR For Each Row
// Formula tends to be faster if you just need one column
new_col = dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa_meas[:ID]
));
// aa_meas WON'T be evaluated unless you specifically do it, so either remove the formula
// or evaluate it using eval(evalexpr()) / eval(substitute())
dt << run formulas;
new_col << Delete Formula();
<BR />/*
// or evaluation (one option, there many other options (local variables, not worrying about the scope, ...))
new_col = Eval(EvalExpr(
dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa = As Constant(Expr(aa_meas));
aa[:ID]
));
));<BR />*/
Ré: Équivalent à un index (Match()) dans ExcelSi vous savez que vos données sont ordonnées, comme elles le sont dans votre tableau de données d'exemple, et en supposant qu'il y aura toujours une deuxième valeur, alors
:Measurement[Col Min( Row(), :ID ) + 1]
est une manière très simple d'utiliser la 2ème rangée de la série.
Ré: Équivalent à un index (Match()) dans ExcelDans la lignée de ce que @txnelson a suggéré, vous pourriez également utiliser ceci :

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]
Cela renverrait la deuxième mesure pour chaque ID.
@JasonWS
J'ai créé ce PowerPoint pour expliquer comment faire des choses dans le sens de la recherche virtuelle dans Excel pour les nouveaux utilisateurs de JMP. J'espère que cela pourra également être utile.
Steve
J'espère que cela aide !
Ré: Équivalent à un index (Match()) dans ExcelLe sujet devient plus compliqué si vous souhaitez regrouper plusieurs entrées pour la référence - ou s'il y a des lignes exclues.
De plus, si vous appliquez souvent de tels calculs au cours de votre travail quotidien, vous ne souhaitez pas créer la formule encore et encore / manuellement.
Il y a un souhait dans la colonne Nouvelle formule de la liste de souhaits/Distribution : « Normaliser » .
mais l'intérêt des autres utilisateurs est assez faible - seulement 2 Kudos...
Alors, j'ai suivi les conseils de @mia_stephens

... et j'ai développé mon propre AddIn. Vous pouvez le trouver sur la Marketplace :
https://marketplace.jmp.com/appdetails/Normalization+GUI
L'AddIn fournit une interface utilisateur pour générer automatiquement de tels calculs.
Outre de nombreuses autres options, il existe une option pour « premier », « dernier » et « N-1 ».

Il est également possible d'utiliser la deuxième entrée pour la normalisation.
Il suffit d'activer

et utilisez une colonne Rank/Order comme expliqué par @shampton82 :

À la fin, la formule ressemblera à ceci :

Très similaire à l'approche de @shampton82 :
Il utilise une agrégation Col ... pour distribuer les valeurs de référence aux autres lignes.
Une différence subtile : il distribue les valeurs et non les indices de ligne .