Ich habe versucht, die zweitgrößten Zahlen aus JMP-Tabellen zu extrahieren. Bisher habe ich es nur manuell gemacht
Absteigend sortieren( Eval List( {:X1, :X2, :X3}));
Wie kann ich einfach die gesamte Tabelle übergeben und nicht einzelne Spaltennamen?

Ihre Vergleichskomponente in Ihrer IF()-Funktion weist ein Logikproblem auf.
If( (Abs( colMax )) > 300 | (Abs( colMax )) > 250
Jeder Wert, der > 250 ist, macht den Vergleich wahr, daher ist >300 nicht erforderlich.
Der Vergleich muss nur lauten:
If( ( Abs( colMax ) > 250,
Sie fragen sich, warum Sie Werte von 193 erhalten?Dies liegt daran, dass die ausgedruckten Werte die zweithöchsten Werte für die Spalte sind und Ihre Filterung auf dem Maximalwert in der Spalte basiert.Der zweithöchste Wert kann einen beliebigen Wert haben.Wenn Sie die folgenden Werte in einer Spalte hätten
Der maximale Spaltenwert ist 600, also würde Ihre IF()-Klausel von Max Col() > 250 übergeben, und der zweithöchste Wert in der Spalte ist 193
Zu Ihrer Frage zu „ Wie finde ich die Zeilennummer des zweithöchsten Werts, z. B. colSecondMaxValues?“, die Möglichkeit dazu ist bereits im Skript enthalten.Die Aussage
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
gibt eine Matrix der Zeilennummern für die Zeilen zurück, die die Maximalwerte in der Spalte haben.Wenn Sie die Zeilennummern für den zweithöchsten Wert benötigen, müssen Sie nur die Zeilen abrufen, bei denen sie dem zweithöchsten Wert entsprechen.Wenn Sie diese Anweisung also nach der Funktion „Insert Into()“ hinzufügen, erhalten Sie die Zeile(n) mit dem zweithöchsten Wert
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Hier ist der vollständige Code
dt = Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNamesList = dt << get column names( string, continuous, numeric );
colSecondMaxValues = {};
// Loop across all continuous columns and find the Max value in
// a column, delete that value, and then find the second max value
// finally, replace the old values, and save the results
For( i = 1, i <= N Items( colNamesList ), i++,
colMax = Col Max( Column( dt, colNamesList[i] ) );
If( Abs( colMax ) > 250,
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
Show( maxRows );
Column( dt, colNamesList[i] )[maxRows] = .;
Insert Into( colSecondMaxValues, Col Max( Column( dt, colNamesList[i] ) ) );
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Show( colSecondMaxValues );
Column( dt, colNamesList[i] )[maxRows] = colMax;
);
);@ich h Es tut mir leid, aber ich benötige die Werte jeder Spalte und nicht einer ganzen Tabelle.
@txnelson Vielen Dank für das Skript. Ich versuche, für dieses Skript eine Bedingung größer als 300 oder 250 zum Laufen zu bringen, und ich kann nicht verstehen, warum es immer noch Werte wie 193 annimmt. Wie kann ich außerdem die Zeilennummer des zweithöchsten Werts ermitteln, z. B. colSecondMaxValues? Vielen Dank für Ihre Hilfe.
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""> 300 | (abs(colMax)) > 250,
maxRows = dt<<GET rows="" where=""></GET></GET>Wenn Sie den zweitgrößten Wert in der gesamten Tabelle wünschen, unabhängig davon, in welcher Spalte er sich befindet:
Names default to here(1);
dt = open( "$SAMPLE_DATA/semiconductor capability.jmp" );
//Find the two largest values in the entire table
Sort Descending(Shape(dt << Get all columns as matrix(),1))[{1, 2}];
//Or, to exclude character columns
Sort Descending(Shape(dt << Get as matrix(dt << get column names(numeric)),1))[{1, 2}];Hier ist ein kleines Skript, das ich geschrieben habe und das den zweithöchsten Wert über alle fortlaufenden Spalten in einer Datentabelle ermittelt
names default to here(1);
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""></GET>