Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineCiao, esiste un modo semplice per trovare il valore massimo di ogni riga e il nome della colonna (o parametro) corrispondente al valore massimo? Di seguito un semplice esempio per illustrare la richiesta:
| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | Valore_max | Col_Name (parametro) |
| 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 |
Grazie!
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineAll'inizio ho letto male la tua domanda... quindi questa risposta contiene una semplificazione, non l'uso di replaceInto, e una variazione che cerca un valore particolare.
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 restituisce le posizioni degli elementi diversi da zero in una matrice. L'operatore == con uno scalare e una matrice restituisce una matrice di 1 e 0. La funzione Loc restituisce una matrice in rowpos (con gli indici degli 1); il [1] prende la prima posizione che corrispondeva a findval. nomi[rowpos[1]] è quindi un nome di colonna e [row] ottiene la risposta corrispondente dalla riga della colonna.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineGrazie Craige!
Invece di Concat(), esiste qualche altra funzione che può essere utilizzata con Substitute Into() per trovare la posizione di un valore particolare in una riga su più colonne?
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
Grazie,
Ravi
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origine(cercando IFMax...) sì, sarebbe molto più semplice da spiegare se potessi elencare facilmente le colonne. Forse anche più veloce. Grazie per segnalarlo!
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineC'è qualcosa di sbagliato nell'usare la funzione IFMax in una nuova colonna?Mi rendo conto che se il numero di colonne è elevato, ciò non è opportuno, ma se ci sono solo 20 colonne o meno, è piuttosto semplice inserire semplicemente la formula IFMax.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineL'abbonamento alla tabella dati è una novità di JMP 13.
Puoi provare qualcosa di simile a questa idea per creare un'espressione che creerà una matrice vettoriale di riga dalla riga corrente quando valutata.
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]
Dato un elenco di nomi di riga, la funzione Substitute Into() sostituisce l'operatore di elenco tra parentesi graffe con la funzione concat. La funzione Concat è la stessa di || operatore di concatenazione e può accettare molti argomenti. La concatenazione valuta ogni riferimento di colonna nell'elenco per la riga corrente. I singoli valori scalari sono concatenati nella matrice di righe.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineCiao Craige,
Quando eseguo lo script di esempio in JMP 10, ricevo un messaggio di errore che dice: l'argomento dovrebbe essere matrice{1} nell'accesso o nella valutazione di 'Loc Max', Argomento errato ...
L'indicizzazione delle tabelle dati non è consentita in JMP10?
Grazie!
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineOK, mi manca qualcosa... in allegato c'è il mio output. Quando controllo i risultati, la colonna MaxVal contiene il valore massimo trovato nelle colonne della riga 3-25 e MaxVal_Col è il nome della colonna in cui è stato trovato il valore massimo.
Cosa mi manca?
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineGrazie ancora Jim! Tuttavia, se esamini l'output, penso che noterai che non è corretto.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineOK....errore mio, pensavo che non fossi riuscito a far eseguire il codice, non che stavi ottenendo risultati non validi. Il problema è che il tuo elenco di colonne, "colnames", non corrisponde all'elenco di colonne su cui stai eseguendo Loc Max. I nomi della prima e della seconda colonna devono essere rimossi dall'elenco "colnames". Il problema ha causato anche un problema nell'ottenere MaxVal utilizzando l'istruzione:
MaxVal = dt[r, posizione];
poiché esaminerebbe l'intera tabella dati e la posizione che restituiva si basa su una matrice che ha 2 colonne in meno rispetto alla tabella dati.
Quindi ho eseguito una semplice riscrittura che mostra un modo per superare il problema
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));
);
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineGrazie Jim! Questo è ciò che ho ottenuto e l'output non è corretto, ad esempio le righe n. 1 e n. 2.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineGrazie Jim! Questo è ciò che ho ottenuto e l'output non è corretto, ad esempio le righe n. 1 e n. 2.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineHo riscontrato alcuni errori che potrebbero essere dovuti alla memorizzazione nella cache. L'unico modo per aggirare il problema è riavviare il sistema operativo e non JMP stesso.
Potresti eseguire lo script aggiornato ma dopo un riavvio del sistema operativo e controllare?
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineEcco la tabella dei dati dopo aver eseguito lo script
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineGrazie mille Jim per la risposta! Tuttavia, a me continua a non funzionare dt=tabella dati corrente(). Non sono sicuro di cosa stia succedendo. A proposito, potresti inviarmi il file di output che hai generato?
Grazie!
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineLo script e la tabella dati hanno funzionato benissimo per me.Ora, ho cambiato il file
dt=Open("........");
A
dt=current data table();
Poiché il tavolo era già aperto.
Quindi, ti suggerisco di provarlo o di inserire un'istruzione aggiuntiva dopo l'istruzione dt=Open:
wait(0);
È possibile che la tabella dati non sia terminata prima dell'inizio di Per ogni riga.L'attesa(0); forzerà il completamento dell'apertura prima di eseguire For Each Row
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineAncora non funziona correttamente per me. In allegato trovi sia lo script che i file di dati. Potresti per favore farmi sapere cosa ho fatto di sbagliato qui?
Grazie!
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineBuon punto. L'esempio potrebbe essere generalizzato in questo modo (disposizione delle colonne intenzionalmente brutta...) Scegli uno dei due/o che funziona meglio per te. Il 2° ha il vantaggio di isolarti da riorganizzazioni accidentali delle colonne. Il primo potrebbe andare bene per centinaia di colonne.
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>Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineRisolto mi mancava l'offset delle colonne che dovevano essere aggiunte alla variabile location.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineHo riscontrato un problema qui, se le colonne che devo scegliere si trovano tra il set di dati, non sembra funzionare.
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;
);
Devo scegliere le colonne da 57 a 113, ma per qualche motivo quando lo faccio tramite lo script ottengo valori errati.
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origine// 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 rowTabella dati con valore massimo dalla riga e nome della colonna massima per riga
Post precedente sulla sottoscrizione della tabella dati
Ri: Valore massimo di ogni riga su più colonne e il nome corrispondente della colonna di origineAlla ricerca della stessa identica soluzione.
Per ogni riga trova il valore massimo e restituisci il nome della colonna in modo da poter eseguire statistiche sui dati risultanti.
Ad esempio, per scoprire quante volte il nome di una colonna viene visualizzato come massimo, il numero di colonne che contribuiscono al valore massimo, STD DEV ecc.