Cerca il valore più vicino<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao a tutti,
Ho bisogno di cercare il valore più vicino di qualcosa in una colonna.C'è una funzione (che proprio non riesco a trovare) per farlo, o devo creare la mia routine per farlo?
Grazie, Natalia
Re: Ricerca del valore più vicinoGrazie per l'aiuto!Funziona.
Re: Ricerca del valore più vicinouso
col = Colonna(dtFile1, "X_location");
Gli oggetti JMP (come la tabella dati in dtFile1) di solito ignorano silenziosamente i messaggi (come <Re: Ricerca del valore più vicino
Scusa per la risposta lenta; Mi sono fatto prendere da qualcos'altro.Inizialmente ho provato la tua seconda soluzione, ma non riesco affatto a farla funzionare.Non riesco nemmeno a trovare il valore minimo della colonna...Cosa sta succedendo?Ho notato che la mia colonna era una colonna di stringhe, non una colonna numerica, quindi l'ho convertita, ma non sembrava essere d'aiuto.
colonna ( dtFile1 , "X_posizione" ) << tipo di dati ( "Numerico" ) ;
col = dtFile1 << Colonna ( "X_posizione" ) ;
righe = Loc Min ((( col << getValues ))) ;
Re: Ricerca del valore più vicinoUn altro modo per usare KDTable.
dt = Apri("$dati_campione/grande classe.jmp");
// crea la matrice di input per kdtable: [95 59, 123 61, 74 55, ...
data = (dt:peso << getasmatrix) || (dt:altezza << getasmatrix);
// crea la tabella di ricerca
ricerca = KDTable (dati);
// fai una ricerca di esempio: trova le 10 persone più vicine con un peso di 100 libbre e un'altezza di 60
// pollici entro una distanza di 5. (5 è nelle stesse "unità" di peso e libbre... normalizzare?)
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100 60] );
// visualizza i risultati
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write(dt:name[rowIndex], " w=", dt:weight[rowIndex], " h=", dt:height[rowIndex], " d=", distanze[irow], "\!n" );
);
/*:
ALFRED l=99 h=64 p=4.12310562561766
CHRIS l=99 h=64 p=4.12310562561766
MARK l=104 h=62 p=4.47213595499958
KATIE l=95 h=59 p=5.09901951359278
quindi d=4.123 è sqrt((100-99)^2+(60-64)^2).Quando Katie è stata scoperta, il raggio di 5 era stato superato, quindi i 10 risultati richiesti erano limitati dal raggio.
KDTable funziona con dati dimensionali K; potresti aver bisogno solo di K=1 (solo peso, per esempio) o K=3 (includere anche l'età).Il problema di ridimensionamento/normalizzazione è più evidente con l'età in questi dati, che hanno un intervallo molto più piccolo dell'altezza o del peso.La distanza da 13 anni a 14 anni è maggiore o minore della distanza da 75 libbre a 80 libbre?
modifica: con solo il peso, sembra ancora più semplice:
dt = Apri("$dati_campione/grande classe.jmp");
// crea la tabella di ricerca
ricerca = KDTable(dt:weight << getasmatrix );
// fai una ricerca di esempio: trova le 10 persone più vicine a un peso di 100 libbre
{rowNumbers, distances} = ricerca <
// visualizza i risultati
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write(dt:name[rowIndex], " w=", dt:weight[rowIndex], " d=", distanze[irow], "\!n" );
);
/*:
ALFRED w=99 d=1
CHRIS w=99 d=1
GIOVANNI w=98 d=2
SEGNA w=104 d=4
KATIE l=95 p=5
JOE w=105 d=5
MICHAEL l=95 p=5
ARGILLA l=105 p=5
DANNY l=106 p=6
Re: Ricerca del valore più vicinoDi seguito sono riportati due modi per ottenere la riga o le righe del valore più vicino. Il primo restituisce una matrice di numeri di riga e quindi consente i pareggi. Per il secondo approccio che utilizza la funzione LocMin() si assume che esista un valore più vicino univoco; restituirà solo il numero di riga della prima istanza e trascurerà eventuali pareggi.
Nomi predefiniti qui ( 1 ) ;
dt = Aprire ( "$SAMPLE_DATA\Big Class.jmp" ) ;
col = Colonna ( "il peso" ) ;
// Seleziona tutte le righe più vicine a un valore
valore = 99.5 ;
d = Addominali ((( col << ottenere valori ) - valore ) ;
righe = loc ( d == min ( d )) ;
Mostrare ( righe ) ;
dt << seleziona le righe ( righe ) ;
// Seleziona la prima riga più vicina a un valore
valore = 112 ;
righe = Loc Min ( Addominali ((( col << ottenere valori ) - valore )) ;
Mostrare ( righe ) ;
dt << seleziona le righe ( righe ) ;
Re: Ricerca del valore più vicinoOppure puoi creare un vettore matrice
righello=indice(1,N righe(dt));
e quindi ordinalo usando la stessa matrice di Rank
rowmatsorted = rowmat;
e quindi conterrà i numeri di riga nello stesso ordine della matrice dei valori ordinati, quindi quando ottieni la posizione del valore più vicina dalla matrice dei valori, la stessa posizione nella matrice rowmatsorted avrà il numero di riga
Re: Ricerca del valore più vicinoGrazie Jim, è fantastico.
Posso sicuramente usare questo.Tuttavia, ho bisogno di conoscere il numero di riga, in modo da poter ottenere il valore corrispondente nella colonna successiva.
Dopo aver usato la tua funzione e aver trovato il valore più vicino, dovrei cercare quel valore nei dati originali per trovare il numero di riga?
Re: Ricerca del valore più vicinoNatalia,
Ecco una semplice funzione che ho scritto che restituisce il valore che è il più vicino al valore target.
Nomi predefiniti qui ( 1 ) ;
dt = aprire ( "$SAMPLE_DATA\Semiconductor Capability.jmp" ) ;
trova il più vicino = Funzione ( { valore , col } ,
{ un , R , aa , appena sopra , appena sotto , valore , col } ,
un = Colonna ( col ) << ottenere valori ;
R = Rango ( un ) ;
aa = smistato = un [ R ] ;
b = 108 ;
appena sopra = aa [ loc ( aa > valore )[ 1 ]] ;
appena sotto = aa [ loc ( aa < valore )[ N righe ( loc ( aa < b ) )]] ;
Se ( appena sopra - valore < valore - appena sotto ,
appena sopra ,
) ;
) ;
mostrare ( minimo = trova il più vicino ( 108 , "NPN1" )) ;