Buscar valor más cercano<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola a todos,
Necesito buscar el valor más cercano de algo en una columna.¿Hay alguna función (que simplemente no puedo encontrar) para hacer esto, o necesito hacer mi propia rutina para hacerlo?
gracias, natalia
Re: Buscar el valor más cercano¡Gracias por tu ayuda!Funciona.
Re: Buscar el valor más cercanousar
col = Columna (dtFile1, "Ubicación_X");
Los objetos JMP (como la tabla de datos en dtFile1) generalmente ignoran silenciosamente los mensajes (como <Re: Buscar el valor más cercano
Disculpe por la tardanza en responder; Me quedé atrapado en otra cosa.Inicialmente probé su segunda solución, pero no puedo hacer que funcione en absoluto.Ni siquiera puedo hacer que localice el valor mínimo de la columna ...¿Que esta pasando?Noté que mi columna era una columna de cadena, no una columna numérica, así que la convertí, pero eso no pareció ayudar en nada.
columna ( dtFile1 , "Ubicación_X" ) << tipo de datos ( "Numérico" ) ;
columna = dtFile1 << Columna ( "Ubicación_X" ) ;
filas = Mínimo de ubicación ((( columna << obtener valores ))) ;
Re: Buscar el valor más cercanoUna forma más de usar KDTable.
dt = Abrir( "$sample_data/big class.jmp" );
// crea la matriz de entrada para kdtable: [95 59, 123 61, 74 55, ...
datos = (dt:peso << getasmatrix) || (dt:altura << getasmatriz);
// crea la tabla de consulta
búsqueda = KDTable(datos);
// haga una búsqueda de ejemplo: encuentre las 10 personas más cercanas a un peso de 100 libras y una altura de 60
// pulgadas dentro de una distancia de 5. (5 está en las mismas "unidades" que el peso y las libras... ¿normalizar?)
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100 60] );
// mostrar los resultados
For( irrow = 1, irow <= N Cols( númerofilas ), irow++,
índiceFilas = NúmerosFilas[ifila];
Write( dt:nombre[índicefila], " w=", dt:peso[índicefila], " h=", dt:altura[índicefila], " d=", distancias[fila], "\!n" );
);
/*:
ALFRED a=99 h=64 p=4,12310562561766
CHRIS w=99 h=64 d=4.12310562561766
MARCA w=104 h=62 d=4.47213595499958
KATIE w=95 h=59 d=5.09901951359278
entonces d=4.123 es sqrt((100-99)^2+(60-64)^2).Cuando se descubrió a Katie, se superó el radio de 5, por lo que los 10 resultados solicitados estaban limitados por el radio.
KDTable funciona con datos dimensionales K; es posible que solo necesite K = 1 (solo peso, por ejemplo) o K = 3 (incluya también la edad).El problema de escala/normalización es más obvio con la edad en estos datos, que tienen un rango mucho más pequeño que la altura o el peso.¿La distancia de 13 a 14 años es mayor o menor que la distancia de 75 a 80 libras?
editar: con solo peso, parece aún más simple:
dt = Abrir( "$sample_data/big class.jmp" );
// crea la tabla de consulta
búsqueda = KDTable( dt:weight << getasmatrix );
// haga una búsqueda de ejemplo: encuentre las 10 personas más cercanas a un peso de 100 libras
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100] );
// mostrar los resultados
For( irrow = 1, irow <= N Cols( númerofilas ), irow++,
índiceFilas = NúmerosFilas[ifila];
Write( dt:nombre[índicefila], " w=", dt:peso[índicefila], " d=", distancias[fila], "\!n" );
);
/*:
ALFRED w=99 p=1
CRIS w=99 d=1
JUAN w=98 d=2
MARCA w=104 d=4
KATIE w=95 p=5
JOE w=105 d=5
MICHAEL w=95 d=5
ARCILLA w=105 d=5
DANNY w=106 d=6
Re: Buscar el valor más cercanoA continuación se muestran dos formas de obtener la(s) fila(s) del valor más cercano. El primero devuelve una matriz de números de fila y, por lo tanto, permite empates. Para el segundo enfoque que usa la función LocMin(), se supone que hay un único valor más cercano; devolverá el número de fila de la primera instancia solamente y despreciará cualquier empate.
Nombres predeterminados hasta aquí ( 1 ) ;
dt = Abierto ( "$SAMPLE_DATA\Gran Clase.jmp" ) ;
columna = Columna ( "peso" ) ;
// Selecciona todas las filas que están más cerca de un valor
valor = 99.5 ;
d = Abdominales (( columna << obtener valores ) - valor ) ;
filas = ubicación ( d == mínimo ( d )) ;
Espectáculo ( filas ) ;
dt << seleccionar filas ( filas ) ;
// Selecciona la primera fila que está más cerca de un valor
valor = 112 ;
filas = Mínimo de ubicación ( Abdominales (( columna << obtener valores ) - valor )) ;
Espectáculo ( filas ) ;
dt << seleccionar filas ( filas ) ;
Re: Buscar el valor más cercanoO bien, puede crear un vector de matriz
rowmat=index(1,N Filas(dt));
y luego ordenarlo usando la misma matriz de rango
filamatsorted = filamat;
y luego contendrá los números de fila en el mismo orden que su matriz de valores ordenados, de modo que cuando obtenga la posición de valor más cercana de la matriz de valores, la misma posición en la matriz ordenada de filas tendrá el número de fila
Re: Buscar el valor más cercanoGracias Jim, esto es genial.
Definitivamente puedo usar esto.Sin embargo, necesito saber el número de fila para poder obtener el valor correspondiente en la siguiente columna.
Después de usar su función y encontrar el valor más cercano, ¿debería buscar ese valor en los datos originales para encontrar el número de fila?
Re: Buscar el valor más cercanonatalia,
Aquí hay una función simple que escribí que devuelve el valor más cercano al valor objetivo.
Nombres predeterminados hasta aquí ( 1 ) ;
dt = abierto ( "$SAMPLE_DATA\Capacidad de semiconductores.jmp" ) ;
encontrarmáscercano = Función ( { valor , columna } ,
{ a , R , Automóvil club británico , justo arriba , justo debajo , valor , columna } ,
a = Columna ( columna ) << obtener valores ;
R = Rango ( a ) ;
Automóvil club británico = ordenado = a [ R ] ;
b = 108 ;
justo arriba = Automóvil club británico [ ubicación ( Automóvil club británico > valor )[ 1 ]] ;
justo debajo = Automóvil club británico [ ubicación ( Automóvil club británico < valor )[ n filas ( ubicación ( Automóvil club británico < b ) )]] ;
Si ( justo arriba - valor < valor - justo debajo ,
justo arriba ,
) ;
) ;
mostrar ( mínimo = encontrarmáscercano ( 108 , "NPN1" )) ;