Cerca il valore più vicino<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao a tutti,
Devo cercare il valore più vicino di qualcosa in una colonna.Esiste una funzione (che non riesco proprio a trovare) per farlo o devo creare la mia routine per farlo?
Grazie, Natalia
Re: Cerca il valore più vicinoGrazie per l'aiuto!Funziona.
Re: Cerca il valore più vicinoutilizzo
col = Colonna( dtFile1, "X_location" );
Gli oggetti JMP (come la tabella dati in dtFile1) di solito ignorano silenziosamente i messaggi (come <Re: Cerca il valore più vicino
Scusa per la risposta lenta; Sono stato preso da qualcos'altro.Inizialmente ho provato la tua seconda soluzione, ma non riesco a farlo funzionare affatto.Non riesco nemmeno a trovarlo per individuare il valore minimo della colonna ...Cosa sta succedendo?Ho notato che la mia colonna era una colonna stringa, non una colonna numerica, quindi l'ho convertita, ma questo non sembrava aiutare nessuno.
colonna ( dtFile1 , "X_posizione" ) << tipo di dati ( "Numerico" ) ;
col = dtFile1 << Colonna ( "X_posizione" ) ;
righe = Località min ((( col << getValues ))) ;
Re: Cerca il valore più vicinoUn altro modo di usare KDTable.
dt = Open( "$sample_data/big class.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 a 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++,
indiceriga =Numeririga[irow];
Write( dt:nome[rowIndex], " w=", dt:weight[rowIndex], " h=", dt:height[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
ALFRED l=99 h=64 p=4.12310562561766
CHRIS l=99 a=64 p=4.12310562561766
MARCHIO l=104 h=62 p=4.47213595499958
KATIE l=95 a=59 p=5.09901951359278
quindi d=4.123 è sqrt((100-99)^2+(60-64)^2).Quando Katie è stata scoperta, il raggio di 5 è stato superato, quindi i 10 risultati richiesti erano limitati dal raggio.
KDTable lavora con dati dimensionali K; potresti aver bisogno solo di K=1 (solo peso, per esempio) o K=3 (includi anche l'età).Il problema di ridimensionamento/normalizzazione è più evidente con l'età in questi dati, che ha un intervallo molto più piccolo rispetto all'altezza o al peso.La distanza dai 13 ai 14 anni è maggiore o minore della distanza da 75 sterline a 80 sterline?
modifica: con solo il peso, sembra ancora più semplice:
dt = Open( "$sample_data/big class.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} = lookup << knearestrows( {10, 5}, [100] );
// visualizza i risultati
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
indiceriga =Numeririga[irow];
Write( dt:nome[rowIndex], " w=", dt:weight[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
ALFRED w=99 d=1
CHRIS w=99 d=1
GIOVANNI w=98 d=2
SEGNO b=104 d=4
KATIE w=95 d=5
JOE w=105 d=5
MICHELE w=95 d=5
ARGILLA w=105 d=5
DANNY w=106 d=6
Re: Cerca il 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 presuppone che esista un valore univoco più vicino; restituirà solo il numero di riga della prima istanza e trascurerà eventuali legami.
I nomi predefiniti sono qui ( 1 ) ;
dt = Aprire ( "$DATI_ESEMPIO\Classe grande.jmp" ) ;
col = Colonna ( "peso" ) ;
// Seleziona tutte le righe più vicine a un valore
valore = 99,5 ;
D = Addominali (( col << ottenere valori ) - valore ) ;
righe = Loc ( D == min ( D )) ;
Spettacolo ( righe ) ;
dt << selezionare le righe ( righe ) ;
// Seleziona la prima riga più vicina a un valore
valore = 112 ;
righe = Località min ( Addominali (( col << ottenere valori ) - valore )) ;
Spettacolo ( righe ) ;
dt << selezionare le righe ( righe ) ;
Re: Cerca il valore più vicinoOppure puoi creare un vettore matrice
rowmat=index(1,N Righe(dt));
e quindi ordinarlo utilizzando la stessa matrice 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: Cerca il 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 utilizzato la funzione e aver trovato il valore più vicino, devo cercare quel valore nei dati originali per trovare il numero di riga?
Re: Cerca il valore più vicinoNatalia,
Ecco una semplice funzione che ho scritto che restituisce il valore che è il più vicino al valore target.
I nomi predefiniti sono qui ( 1 ) ;
dt = aprire ( "$SAMPLE_DATA\Semiconductor Capability.jmp" ) ;
findClosest = 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 ,
) ;
) ;
spettacolo ( minimo = findClosest ( 108 , "NPN1" )) ;