Entspricht einem Index(Match()) in ExcelIch habe einige Daten, für die ich den %-Fehler zwischen der ersten und allen nachfolgenden Messungen für jede eindeutige ID berechnen möchte. Ich konnte nicht herausfinden, wie ich Daten aus einer Zelle basierend auf Werten aus anderen Zeilen-Spalten abrufen kann. Benötigt dies JSL oder kann ich einfach eine Formel erstellen, wie ich es in Excel getan habe?
Ich möchte, dass die beiden Spalten, die ich hervorgehoben habe, mithilfe einer Formel berechnet werden, aber bei Tausenden von Datenzeilen im tatsächlichen Satz könnte ich es verstehen, wenn es ein Skript sein muss und die Werte statisch bleiben, bis das Skript erneut ausgeführt wird.

Jede Hilfe wäre willkommen.
Ich verwende JMP 16.
Grundlegende Datenanalyse und ModellierungBetreff: Entspricht einem Index(Match()) in ExcelSie können die früheste Messung erhalten, indem Sie Col Min(Row(), :ID) verwenden.
:Measurement[Col Min(Row(), :ID)]
Sie können dies dann in einer separaten Spalte oder einfach als Teil einer einzelnen Formel verwenden, mit der Ihr Ergebnis berechnet wird
Betreff: Entspricht einem Index(Match()) in ExcelDanke, das funktioniert.
Ich habe jedoch eine Sorge: Was wäre, wenn ich den zweiten Wert für jede ID verwenden möchte?
Für ID == A hätte ich also 10.00001 in der Spalte „Früheste Messung“.
Betreff: Entspricht einem Index(Match()) in ExcelEs gibt eine ganze Reihe verschiedener Optionen, die jedoch etwas schwierig zu verstehen sein können. Die „einfachste“ Idee besteht darin, die statistische Funktion Col mit einer if-Anweisung zu kombinieren, und die if-Anweisung gibt entweder den fehlenden oder den gesuchten Wert zurück.
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

Der Vorteil der Verwendung statistischer Spaltenfunktionen besteht darin, dass sie sich gut zum Gruppieren von Spalten und als Formeln eignen.
Betreff: Entspricht einem Index(Match()) in ExcelDie Methode, die ich als am „JMP-ähnlichsten“ erachte, ist eine interaktive Lösung, bei der JMP automatisierte Prozesse erstellt (mithilfe eines erweiterten Protokoll-/Workflow-Generators) und anschließend die „Probleme“ behebt, die durch das von JMP erstellte Skript verursacht wurden:
Da Sie bereits eine Spalte „Order“ haben, die Sie vermutlich verwenden können, erstellen Sie eine Teilmenge von nur Order == 2. Klicken Sie mit der rechten Maustaste -> wählen Sie übereinstimmende Zellen aus -> erstellen Sie eine Teilmenge


Benennen Sie die Spalte „Messung“ in der Teilmenge um. Gehen Sie dann zurück zu Ihrer ursprünglichen Tabelle und verwenden Sie „Aktualisieren“, um die Teilmenge wieder mit Ihrer Tabelle zu verknüpfen. Verwenden Sie dabei die Spalte „ID“ als Übereinstimmungsbedingungsspalte.

und jetzt haben Sie Ihre Messung aus Bestellung zwei in einer Spalte. Und JMP schreibt Ihnen ein Skript wie dieses:
// 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)
);
Es ist definitiv nicht das beste Skript, aber es funktioniert und gibt eine Vorstellung davon, was getan wird. Sie können auch die Workflow-Aufzeichnung starten, bevor Sie diesen Prozess starten, und einen Workflow erstellen, um dies zu automatisieren (ich persönlich verwende keine Workflows und bevorzuge erweiterte Protokolle, aber sie können sehr hilfreich sein, insbesondere wenn Sie etwas automatisieren möchten). Ein vom Workflow Builder erstelltes Skript könnte ungefähr so aussehen
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();
Generell haben mit Workflow Builder erstellte Skripte ähnliche Probleme wie mit erweiterten Protokollen erstellte Skripte, aber Workflows haben zusätzliche Vorteile (wenn Sie sie so betrachten möchten, betrachte ich sie eher als Ärgernis, wenn nicht als sehr einfache Dinge wie das Aktualisieren von Referenzen). Und so würde ich das mit JMP erstellte Skript ändern
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);
Dies kann auch mit „fortgeschrittenerem“ JSL erfolgen, aber wenn Sie Formeln verwenden und JSL vermeiden möchten, würde ich sie im Allgemeinen nicht verwenden. Sie sollten sie nur verwenden, wenn Sie Geschwindigkeit benötigen, und selbst in diesem Fall können sie manchmal langsamer sein, wenn Sie sie nicht optimieren. Hier ist eine Option mit JSL und einigen Kommentaren zur Erläuterung
Mehr anzeigen...
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 />*/
Betreff: Entspricht einem Index(Match()) in ExcelWenn Sie wissen, dass Ihre Daten so geordnet sind, wie in Ihrer Beispieldatentabelle, und davon ausgehen, dass es immer einen zweiten Wert gibt, dann
:Measurement[Col Min( Row(), :ID ) + 1]
ist eine sehr einfache Möglichkeit, die 2. Reihe in der Serie zu verwenden.
Betreff: Entspricht einem Index(Match()) in ExcelIn Anlehnung an den Vorschlag von @txnelson könnten Sie auch Folgendes verwenden:

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]
Dies würde die zweite Messung für jede ID zurückgeben.
@JasonWS
Ich habe diese PowerPoint-Präsentation zusammengestellt, um neuen JMP-Benutzern zu erklären, wie man Dinge wie Vlookup in Excel macht. Ich hoffe, sie kann auch helfen.
Steve
Hoffe, es hilft!
Betreff: Entspricht einem Index(Match()) in ExcelKomplizierter wird das Thema, wenn man für die Referenz mehrere Einträge aggregieren möchte – oder wenn es ausgeschlossene Zeilen gibt.
Wenn Sie derartige Berechnungen in Ihrer täglichen Arbeit außerdem häufig durchführen, möchten Sie die Formeln nicht immer wieder neu bzw. manuell erstellen.
In der Wunschliste befindet sich ein Wunsch: Neue Formelspalte/Verteilung: „Normalisieren“ .
aber das Interesse anderer Benutzer ist ziemlich gering – nur 2 Kudos …
Also folgte ich dem Rat von @mia_stephens

... und habe ein eigenes AddIn entwickelt. Es ist im Marketplace zu finden:
https://marketplace.jmp.com/appdetails/Normalization+GUI
Das Add-In bietet eine Benutzeroberfläche, um solche Berechnungen automatisch zu generieren.
Neben vielen weiteren Auswahlmöglichkeiten gibt es jeweils eine Option für „Erster“, „Letzter“ und „N-1“.

Es besteht auch die Möglichkeit den zweiten Eintrag zur Normalisierung zu verwenden.
Einfach aktivieren

und verwenden Sie eine Rang-/Reihenfolgespalte, wie von @shampton82 erklärt:

Am Ende sieht die Formel folgendermaßen aus:

Sehr ähnlich dem Ansatz von @shampton82 :
Es verwendet eine Col...- Aggregation, um die Referenzwerte auf die anderen Zeilen zu verteilen.
Ein subtiler Unterschied: Es verteilt die Werte , nicht die Zeilenindizes .