Berechnungen zwischen Zeilen basierend auf BedingungenHallo, ich bin neu im JMP-Scripting, aber einigermaßen an die Python-Sprache gewöhnt. Ich versuche Folgendes mit meiner Dummy-Testtabelle unten zu erreichen:
1) Gehen Sie alle Zeilen durch (sowohl vor als auch nach der Zeile) und führen Sie Berechnungen nur für die Zeilen durch, bei denen Cuvette == 11 ist. Für die übrigen Zeilen, bei denen Cuvette != 11 ist, kann die „Ausgabe“ auf NA oder einen beliebigen Wert eingestellt werden.
2) Die Berechnung selbst erfolgt zwischen zwei separaten Zeilen. In Zeilen mit Cuvette == 11 muss die 850-nm-Zelle der Zeile durch die 250-nm-Zelle der Zeile geteilt werden, die zwei Bedingungen erfüllt:
a) Küvette == 12
b) Der Pass-Wert muss zwischen den Zeilen übereinstimmen, zB Pass-Wert für Küvette 11 == Pass-Wert für Küvette 12
| Passieren |
850 nm |
250 nm |
Küvette |
Ausgabe |
| 1 |
100 |
200 |
11 |
100/500 = 0,2 |
| 2 |
400 |
500 |
11 |
400 / 400 = 1 |
| 3 |
300 |
100 |
11 |
300 / 900 = 0,33 |
| 1 |
700 |
500 |
12 |
DAS |
| 2 |
200 |
400 |
12 |
DAS |
| 3 |
400 |
900 |
12 |
DAS |
| 1 |
400 |
800 |
13 |
DAS |
| 2 |
500 |
700 |
13 |
DAS |
| 3 |
300 |
700 |
13 |
DAS |
Automatisierung und SkriptingGrundlegende Datenanalyse und -modellierungBetreff: Berechnungen zwischen Zeilen basierend auf BedingungenUm dies auf JMP-ähnliche Weise zu tun, würden Sie im Allgemeinen Ihre Daten aufteilen und dann die Berechnung durchführen ( JMP ist keine Tabellenkalkulation ), sie dann wieder zusammenführen oder mit den aufgeteilten Daten fortfahren.
Sie können für diese Berechnung aber auch JSL oder eine Formel verwenden, sollten aber zunächst die Aufteilungsoption in Betracht ziehen.
Betreff: Berechnungen zwischen Zeilen basierend auf BedingungenWillkommen in der Community.
Hier ist ein Beispiel, wie ich Ihr Problem angehen würde

Names Default To Here( 1 );
dt = Current Data Table();
// Separate out the Cuvette==12 rows into a separate data table
// and then join the Pass==Pass rows to the Cuvette==11 rows
// Then calculate the Output column
// Select the Cuvette==12 rows
dt << Select Where( :Cuvette == 12 );
// Create a new subsetted data table with those rows
dt12 = dt << Subset( Selected Rows( 1 ), columns( :Pass, :"250 nm"n ) );
// Change 250 nm column name so when joined back to original table
// it will have a unique column name
dt12:"250 nm"n << Set Name( "Divisor" );
// For alignment reasons, add a new column called Cuvette and set
// it equal to 11
dt12 << New Column( "Cuvette", Set Each Value( 11 ) );
// Join the tables using the Update Platform
dt << Update(
With( dt12 ),
Match Columns( :Pass = :Pass, :Cuvette = :Cuvette )
);
// Create the new Output column
dt << New Column( "Output", Set Each Value( :"850 nm"n / :Divisor ) );
// Remove Divisor column since it is no longer needed
dt << delete columns( Divisor );
// Close the subsetted data table since it is no longer needed
Close( dt12, nosave );
// Remove the Selected RowStates from the data table
dt << clear rowstates;
Nachfolgend finden Sie einen direkteren Ansatz, der jedoch deutlich ineffizienter ist und die gleichen Ergebnisse liefert. Bei großen Datentabellen ist diese Methode recht langsam.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Output",
Formula(
foundRow = [];
If( :Cuvette == 11,
curPass = :Pass;
foundRow = Current Data Table() <<
get rows where( :Cuvette == 12 & :Pass == curPass );
If( N Items( foundRow ) > 0,
:"850 nm"n / :"250 nm"n[foundRow[1]]
);
);
)
);
Betreff: Berechnungen zwischen Zeilen basierend auf BedingungenHier ist eine Matrixoption, aber die Verwendung von JMP-Funktionen ist im Allgemeinen einfacher zu verstehen
Names Default To Here(1);
dt = Current Data Table();
cuvette_start = 11;
cuvette_end = 12;
cuvettes = dt[0, "Cuvette"];
// Data is sorted -> we can just take values and make comparison
start_idx = Loc(cuvettes, cuvette_start);
end_idx = Loc(cuvettes, cuvette_end);
// differences
output = J(1, N Rows(dt), .);
output[start_idx] = dt[start_idx, "850 nm"] :\</img> dt[end_idx, "250 nm"];
dt << new column("R", Numeric, Continuous, Values(output));
Wenn Sie sich stark auf die Reihenfolge verlassen können, können Sie eine Formel wie diese verwenden
If(:Cuvette == 11,
:"850 nm"n / :"250 nm"n[Col Min(If(:Cuvette == 12, Row(), .)) + Row() - 1];
);
Die Art der endgültigen Formel hängt stark von Ihrem tatsächlichen Anwendungsfall ab (sind die Daten „richtig“ sortiert, suchen Sie nach mehr als einem Wertevergleich usw.).