Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenHola, ¿existe una manera fácil de encontrar el valor máximo de cada fila y el nombre de la columna (o parámetro) correspondiente al valor máximo? A continuación se muestra un ejemplo sencillo para ilustrar la solicitud:
| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | Valor máximo | Col_Name (Parámetro) |
| 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 |
¡Gracias!
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenAl principio leí mal su pregunta... por lo que esta respuesta contiene una simplificación, sin utilizar sustitutoInto, y una variación que busca un valor particular.
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 devuelve las posiciones de los elementos distintos de cero en una matriz. El operador == con un escalar y una matriz devuelve una matriz de unos y ceros. La función Loc devuelve una matriz en rowpos (con los índices de los unos); el [1] toma la primera ubicación que coincidió con findval. nombres[rowpos[1]] es entonces un nombre de columna, y [fila] obtiene la respuesta coincidente de la fila de la columna.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenGracias Craige!
En lugar de Concat(), ¿hay alguna otra función que pueda usarse con Substitute Into() para encontrar la posición de un valor particular en una fila en varias columnas?
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
Gracias,
Ravi
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origen(buscando IFMax...) sí, eso sería mucho más fácil de explicar si pudiera enumerar fácilmente las columnas. Posiblemente también más rápido. ¡Gracias por mencionarlo!
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origen¿Hay algún problema con el uso de la función IFMax en una nueva columna?Me doy cuenta de que si el número de columnas es grande, esto es complicado, pero si solo hay 20 columnas o menos, es bastante sencillo ingresar la fórmula IFMax.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenLa subscripción de la tabla de datos es nueva en JMP 13.
Puede probar algo como esta idea para crear una expresión que creará una matriz de vector de fila a partir de la fila actual cuando se evalúe.
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]
Dada una lista de nombres de filas, la función Sustituir en() reemplaza el operador de lista de llaves con la función concat. La función Concat es la misma que || operador de concatenación y puede tomar muchos argumentos. La concatenación evalúa cada referencia de columna en la lista para la fila actual. Los valores escalares individuales se concatenan en la matriz de filas.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenHola Craige,
Cuando ejecuto su script de muestra en JMP 10, aparece un mensaje de error que dice: el argumento debe ser matriz{1} en el acceso o evaluación de 'Loc Max', argumento incorrecto...
¿No se permite la indexación de tablas de datos en JMP10?
¡Gracias!
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenBien, me falta algo... adjunto está mi resultado. Cuando verifico los resultados, la columna MaxVal contiene el valor máximo encontrado en las columnas 3 a 25 de esa fila, y MaxVal_Col es el nombre de la columna donde se encontró el valor máximo.
¿Qué me estoy perdiendo?
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origen¡Gracias Jim de nuevo! Sin embargo, si examina el resultado, creo que notará que no es correcto.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenOK... mi error, estaba pensando que no pudiste ejecutar el código, no que obtuviste resultados no válidos. El problema es que su lista de columnas, "colnames", no coincide con la lista de columnas en las que está realizando Loc Max. Los nombres de la primera y segunda columna deben eliminarse de la lista de "nombres de columna". El problema también causó un problema al obtener MaxVal usando la declaración:
MaxVal = dt[r, ubicación];
ya que estaría mirando toda la tabla de datos y la ubicación que devolvía se basa en una matriz que tiene 2 columnas menos que la tabla de datos.
Así que hice una reescritura simple que muestra una forma de superar el 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));
);
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenGracias Jim! Esto es lo que obtuve y el resultado no es correcto, por ejemplo, las filas 1 y 2.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenGracias Jim! Esto es lo que obtuve y el resultado no es correcto, por ejemplo, las filas 1 y 2.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenHe visto algunos errores sospechosos debido al almacenamiento en caché. La única forma de solucionarlos es reiniciando mi sistema operativo y no JMP.
¿Podría ejecutar el script actualizado pero después de reiniciar el sistema operativo y verificarlo?
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenAquí está la tabla de datos después de ejecutar el script.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origen¡Muchas gracias Jim por la respuesta! Sin embargo, todavía no me funciona con dt=tabla de datos actual(). No estoy seguro de lo que está pasando. Por cierto, ¿podrías enviarme el archivo de salida que generaste?
¡Gracias!
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenEl script y la tabla de datos funcionaron muy bien para mí.Ahora sí cambié el
dt=Open("........");
a
dt=current data table();
Ya que la mesa ya estaba abierta.
Entonces, te sugiero que pruebes eso, o que coloques una declaración adicional después de tu declaración dt=Open:
wait(0);
Existe la posibilidad de que su tabla de datos no haya terminado antes de que comience Para cada fila.La espera(0); forzará la apertura para que se complete antes de ejecutar el proceso Para cada fila
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenTodavía no me funciona correctamente. Adjunto encontrará tanto el script como los archivos de datos. ¿Podrías decirme qué hice mal aquí?
¡Gracias!
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenBuen punto. El ejemplo podría generalizarse así (disposición de columnas intencionalmente fea...) Elija uno de los dos que funcione mejor para usted. El segundo tiene la ventaja de aislarle de reordenamientos accidentales de las columnas. El primero podría ser bueno para cientos de columnas.
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>Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenSe resolvió que me faltaba el desplazamiento de las columnas que debían agregarse a la variable de ubicación.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenMe encontré con un problema aquí: si las columnas que necesito elegir están entre el conjunto de datos, no parece funcionar.
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;
);
Necesito elegir las columnas 57 a 113, pero por alguna razón, cuando lo hago a través del script, obtengo valores incorrectos.
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origen// 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 rowTabla de datos con valor máximo de fila y nombre de columna máxima para fila
Publicación anterior sobre subíndices de tablas de datos
Re: Valor máximo de cada fila en varias columnas y el nombre correspondiente de la columna de origenBuscando exactamente la misma solución.
Para cada fila, busque el valor máximo y devuelva el nombre de la columna para poder ejecutar estadísticas sobre los datos resultantes.
Por ejemplo, para encontrar cuántas veces el nombre de una columna aparece como máximo, el número de columnas que contribuyen al valor máximo, el STD DEV, etc.