Maximaler Wert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteHallo, gibt es eine einfache Möglichkeit, den Maximalwert jeder Zeile und den Spaltennamen (oder Parameter) zu ermitteln, der dem Maximalwert entspricht? Nachfolgend finden Sie ein einfaches Beispiel zur Veranschaulichung der Anfrage:
| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | Max_Value | Col_Name (Parameter) |
| 87,2 | 83,6 | 81,4 | 83 | 83 | 83 | 83 | 82,3 | 83,3 | 84,6 | 87,2 | T1 |
| 85,9 | 84 | 82 | 84 | 83,3 | 83,3 | 84 | 83 | 86,5 | 87,2 | 87,2 | T10 |
| 84,9 | 82,7 | 86 | 83 | 82,3 | 82,3 | 83 | 82 | 83,6 | 85,2 | 86 | T3 |
| 85,6 | 84,6 | 82,7 | 84,6 | 84,3 | 84,3 | 84,3 | 83,6 | 84,9 | 86,2 | 86,2 | T10 |
| 85,2 | 83,6 | 82 | 83,3 | 83 | 83 | 83,3 | 82,3 | 84,3 | 85,6 | 85,6 | T10 |
| 86,8 | 84,3 | 82,7 | 84,3 | 83,6 | 83,6 | 84,3 | 83,3 | 85,9 | 86,2 | 86,8 | T1 |
| 86,2 | 84 | 82,3 | 84 | 87 | 83,3 | 83,6 | 83 | 84,9 | 85,9 | 87 | T5 |
| 88.1 | 84,6 | 82,3 | 84,3 | 83,6 | 84 | 84,3 | 83,3 | 85,9 | 86,2 | 88.1 | T1 |
| 85,6 | 83,3 | 81,7 | 83,3 | 83 | 83 | 83,6 | 82,7 | 84 | 85,9 | 85,9 | T10 |
| 37.4 | 36.1 | 36.4 | 36.4 | 36.1 | 36.1 | 36.4 | 35.4 | 36.7 | 37.4 | 37.4 | T1 |
| 36.7 | 34.5 | 34.8 | 34.5 | 33.8 | 34.1 | 34.5 | 33.5 | 36.1 | 36.1 | 36.7 | T1 |
| 34.8 | 32.9 | 33.2 | 32.9 | 32.2 | 32.5 | 36 | 31.9 | 33.8 | 35.1 | 36 | T7 |
| 38 | 36.4 | 36.4 | 36.4 | 36.4 | 36.1 | 36.7 | 39 | 38 | 38.3 | 39 | T8 |
| 38 | 35.1 | 35.1 | 40 | 34.1 | 34.5 | 34.8 | 33.8 | 36.4 | 37 | 40 | T4 |
Danke!
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteIch habe Ihre Frage zunächst falsch verstanden ... daher enthält diese Antwort eine Vereinfachung, bei der replacementInto nicht verwendet wird, und eine Variation, die nach einem bestimmten Wert sucht.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
findval=7;
row = 2;
Row() = row; // names will pull data from the current row
rowpos = Loc( findval==matrix(evallist(names)) );
show(names[rowpos],names[rowpos[1]][row]);
names[rowpos] = {:third};
names[rowpos[1]][2] = 7;
Loc gibt die Positionen der Nicht-Null-Elemente in einer Matrix zurück. Der ==-Operator mit einem Skalar und einer Matrix gibt eine Matrix aus Einsen und Nullen zurück. Die Loc-Funktion gibt eine Matrix in rowpos zurück (mit den Indizes der Einsen); Die [1] nimmt den ersten Ort an, der mit findval übereinstimmt. namen[rowpos[1]] ist dann ein Spaltenname, und die [Zeile] erhält die passende Antwort aus der Zeile der Spalte.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteDanke Craige!
Gibt es anstelle von Concat() eine andere Funktion, die mit Substitute Into() verwendet werden kann, um die Position eines bestimmten Werts in einer Zeile über mehrere Spalten hinweg zu finden?
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowpos = Loc( names, 6 ); // works only with a list
Danke,
Ravi
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der Quellspalte(nach IFMax suchen...) Ja, das wäre viel einfacher zu erklären, wenn Sie die Spalten einfach auflisten könnten. Möglicherweise auch schneller. Danke für den Hinweis!
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteIst die Verwendung der IFMax-Funktion in einer neuen Spalte falsch?Mir ist klar, dass dies unbrauchbar ist, wenn die Anzahl der Spalten groß ist, aber wenn es nur 20 Spalten oder weniger sind, ist es ziemlich einfach, einfach die IFMax-Formel einzugeben.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteDie Datentabellensubskription ist neu in JMP 13.
Sie können so etwas wie diese Idee ausprobieren, um einen Ausdruck zu erstellen, der bei der Auswertung eine Zeilenvektormatrix aus der aktuellen Zeile erstellt.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowvec = (Eval( names )); // [5 6 7 8]
Bei einer Liste mit Zeilennamen ersetzt die Funktion „Substitute Into()“ den Listenoperator mit geschweiften Klammern durch die Funktion „concat“. Die Concat-Funktion ist dieselbe wie || Verkettungsoperator und kann viele Argumente annehmen. Die Verkettung wertet jeden Spaltenverweis in der Liste für die aktuelle Zeile aus. Die einzelnen Skalarwerte werden in der Zeilenmatrix verkettet.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteHallo Craige,
Wenn ich Ihr Beispielskript in JMP 10 ausführe, erhalte ich die Fehlermeldung: „Argument sollte Matrix sein{1} beim Zugriff oder bei der Auswertung von „Loc Max“, schlechtes Argument ...“
Ist die Indizierung von Datentabellen in JMP10 nicht zulässig?
Danke!
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteOK, mir fehlt etwas ... im Anhang ist meine Ausgabe. Wenn ich die Ergebnisse überprüfe, enthält die Spalte „MaxVal“ den Maximalwert, der in den Zeilenspalten 3–25 gefunden wurde, und „MaxVal_Col“ ist der Name der Spalte, in der der Maximalwert gefunden wurde.
Was vermisse ich?
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteNochmals vielen Dank, Jim! Wenn Sie jedoch die Ausgabe untersuchen, werden Sie meiner Meinung nach feststellen, dass sie nicht korrekt ist.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteOK...mein Fehler, ich dachte, Sie hätten den Code nicht zum Laufen bringen können, nicht, dass Sie ungültige Ergebnisse erhalten hätten. Das Problem besteht darin, dass Ihre Spaltenliste „colnames“ nicht mit der Liste der Spalten übereinstimmt, für die Sie Loc Max ausführen. Die Namen der ersten und zweiten Spalte müssen aus der Liste „colnames“ entfernt werden. Das Problem verursachte dann auch ein Problem beim Abrufen des MaxVal mithilfe der Anweisung:
MaxVal = dt[r, Ort];
da die gesamte Datentabelle betrachtet würde und der zurückgegebene Speicherort auf einer Matrix basiert, die zwei Spalten weniger als die Datentabelle hat.
Deshalb habe ich eine einfache Neufassung vorgenommen, die einen Weg zur Lösung des Problems zeigt
dt = Open( "C:/data.jmp" );
colnames = dt << getcolumnnames;
For( i = 2, i >= 0, i--,
colnames = Remove( colnames, i, 1 )
);
For Each Row(
r = Row();
location = Loc Max( dt[r, 3 :: 25] ); // location of maximum value in array from Col #3 to #25
//MaxVal = dt[r, location];
MaxVal_Col = colnames[location] << getname;
MaxVal = as column(eval(MaxVal_Col));
);
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteDanke Jim! Das habe ich erhalten und die Ausgabe ist nicht korrekt, zum Beispiel Zeile Nr. 1 und Nr. 2.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteDanke Jim! Das habe ich erhalten und die Ausgabe ist nicht korrekt, zum Beispiel Zeile Nr. 1 und Nr. 2.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteIch habe einige Fehler gesehen, die vermutlich auf das Caching zurückzuführen sind. Die einzige Möglichkeit, diese zu umgehen, besteht darin, mein Betriebssystem und nicht JMP selbst neu zu starten.
Könnten Sie das aktualisierte Skript nach einem Neustart des Betriebssystems ausführen und überprüfen?
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteHier ist die Datentabelle, nachdem ich das Skript ausgeführt habe
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteVielen Dank, Jim, für die Antwort! Allerdings funktioniert es bei mir immer noch nicht dt=aktuelle Datentabelle(). Ich bin mir nicht sicher, was los ist. Übrigens, könnten Sie mir die von Ihnen generierte Ausgabedatei senden?
Danke!
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteDas Skript und die Datentabelle haben bei mir hervorragend funktioniert.Jetzt habe ich das geändert
dt=Open("........");
Zu
dt=current data table();
Da der Tisch bereits offen war.
Daher würde ich vorschlagen, dass Sie das versuchen oder nach Ihrer dt=Open-Anweisung eine zusätzliche Anweisung einfügen:
wait(0);
Es besteht die Möglichkeit, dass Ihre Datentabelle noch nicht fertig ist, bevor „Für jede Zeile“ beginnt.Das Warten(0); erzwingt, dass das Öffnen abgeschlossen wird, bevor „Für jede Zeile“ ausgeführt wird
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteBei mir funktioniert es immer noch nicht richtig. Im Anhang finden Sie sowohl das Skript als auch die Datendateien. Könnten Sie mir bitte mitteilen, was ich hier falsch gemacht habe?
Danke!
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteGuter Punkt. Das Beispiel könnte man so verallgemeinern (absichtlich hässliche Spaltenanordnung...) Wählen Sie eines der Entweder/Oder, das für Sie am besten geeignet ist. Die zweite Option hat den Vorteil, dass Sie vor versehentlichen Neuanordnungen der Spalten geschützt sind. Der erste könnte für Hunderte von Spalten geeignet sein.
dt = New Table( "Untitled",
New Column( "maxval", numeric ),
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "maxcol", Numeric ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
);
// either
vars = [2 4 5];
colnames = (dt << getcolumnnames)[vars];
// or
colnames={a,b,c}; // this might be best choice
For Each Row(
row = Row();
location = Loc Max( dt[ row, colnames] ); // location of maximum value in array
col = colnames[location]<<GETNAME></GETNAME>Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteBehoben: Mir fehlte der Offset der Spalten, die zur Standortvariablen hinzugefügt werden mussten.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteIch bin hier auf ein Problem gestoßen: Wenn die Spalten, die ich auswählen muss, zwischen den Datensätzen liegen, scheint es nicht zu funktionieren.
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 57 :: 113] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
Ich muss die Spalten 57 bis 113 auswählen, aber aus irgendeinem Grund wird das über das Skript deaktiviert und ich erhalte falsche Werte.
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der Quellspalte// this example uses JMP 13 data table indexing
dt = New Table( "Untitled",
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
New Column( "maxval", numeric ),
New Column( "maxcol", Numeric )
);
colnames = dt << getcolumnnames;
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 1 :: 3] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
Data table with maximum value from row and name of maximum column for rowData table with maximum value from row and name of maximum column for rowDatentabelle mit Maximalwert aus Zeile und Name der Maximalspalte für Zeile
Früherer Beitrag zum Subskribieren von Datentabellen
Betreff: Maximalwert jeder Zeile über mehrere Spalten hinweg und der entsprechende Name der QuellspalteSuche genau die gleiche Lösung.
Suchen Sie für jede Zeile den Maximalwert und geben Sie den Spaltennamen zurück, damit ich Statistiken zu den resultierenden Daten erstellen kann.
Um beispielsweise herauszufinden, wie oft ein Spaltenname als Maximum angezeigt wird, um die Anzahl der Spalten, die zum Maximalwert beitragen, um die STD-DEV usw.