Filas subsiguientes que dependen de diferentes columnas de las filas anterioresHola, estoy trabajando con un conjunto de experimentos en los que algunos experimentos dependen de experimentos anteriores (es decir, estoy mezclando soluciones que hice anteriormente para hacer otras nuevas). Estoy tratando de hacer una función donde lee una columna para obtener el nombre de la solución anterior, busca una segunda columna para encontrar la fila con ese nombre, luego toma el valor en una celda con esa fila y una tercera columna. Match parece hacer esto, pero no puedo hacer que funcione, y creo que es en parte porque match espera un nivel establecido explícitamente en la columna de búsqueda, y tal vez otras cosas de las que no me doy cuenta. No tengo experiencia en JSL y preferiría algo como una función de columna de coincidencia, pero si JSL es lo que se necesita, entonces está bien.
Adjunté una tabla ficticia que debería transmitir el punto sin ver todas mis otras columnas superfluas. La última columna es la que tiene la fórmula que está fallando, y aquí hay una captura de pantalla

y el código de lo que no funciona si es más fácil de manejar:
Match( :Nombre de la solución, :Solución usada para la dilución, :Concentración dada) /
:Factor de dilución
Gracias de antemano.
Automatización y secuencias de comandosventanasRe: Filas subsiguientes que dependen de diferentes columnas de las filas anterioresUna opción es usar algo como esto para obtener el índice
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
entonces puedes usar Subíndice de tabla de datos para acceder al valor en la fila específica de la fila. Así que la fórmula final es algo como esto
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Re: Filas subsiguientes que dependen de diferentes columnas de las filas anterioresAquí está la fórmula que se me ocurrió.Es posible que se pueda simplificar, pero en su forma actual parece funcionar.
x = .;
If( :Used solution for dilution[Row()] != "",
curRow = Row();
targetRow = (Current Data Table() << get rows where(
:Letters == :Used solution for dilution[curRow]
))[1];
x = :Given Concentration[targetRow] / :Dilution Factor[curRow];
);
x;
Re: Filas subsiguientes que dependen de diferentes columnas de las filas anterioresEy @jthi - ¡Esto funcionó! Solo para entender la lógica, ya que esta es la primera vez que interactúo con JSL, y prefiero no inferir completamente lo que está pasando:
1. :Column1 << Get Values crea una lista temporal que es idéntica en contenido y orden a :Column1.
2. Loc(:Columna2 << Obtener valores, :Columna2) da una lista ordenada de todos los números de fila donde :Columna1 coincide con el contenido de cada fila en :Columna2. Asignamos eso a row_idx.
Dentro de la sentencia if,
3. N Items(row_idx) < 1 dice que si la lista es nula (es decir, no hay coincidencias), la dejamos en blanco poniendo un "." en,
4. Si hay una entrada mayor o igual a 1 en la lista row_idx, :Column3[row_idx[1]] es un índice de un índice, donde tomamos la primera entrada en la lista row_idx, usamos esa entrada como la enésima entrada de :Columna3.
¿Es esa la esencia de esto?
¡Gracias por trabajar en esto!
Re: Filas subsiguientes que dependen de diferentes columnas de las filas anteriores@txnelson Gracias por el código; ¡el tuyo también ha funcionado! No tengo ninguna experiencia con JSL, ninguno solo ha trabajado con VBA y Matlab, así que con @jthi , Quiero entender. Así que para asegurarme de que entiendo
1. x=. simplemente define una variable vacía x.
2. Si hay celdas de :Used solution for dilution en la misma fila que la que se está evaluando que no están en blanco =>
3. curRow = Row() define curRow como el número de fila actual
4. obtener filas donde (
:Nombre de la solución == :Solución usada para dilución[curRow]
))[1]
toma el valor de las soluciones :Used para la dilución de la fila actual al usar eso como un índice, y "obtiene [s] fila [números] donde" esos valores son idénticos a los de :Solution.
5. targetRow = (Current Data Table() << obtener filas donde(... luego crea una matriz a partir de las filas determinadas en el paso 3, el subíndice 1 toma la primera entrada en esta matriz, .
6. Finalmente x se completa dividiendo la fila de :Concentración dada que especificamos en 4, por el :Factor de dilución en la fila actual, especificada en 3.
7. Devolvemos "x" a la celda.
Mi única pregunta es del paso 5, creo que targetRow es una lista de cada entrada en la Fila que queremos, pero luego, para que el paso seis funcione, tiene que devolver el número de fila real. Creo que no entiendo bien cómo funciona la tabla de datos actual () << obtener filas donde (...). ¿Podría elaborar?
¡Gracias de nuevo por tomarse el tiempo!
Re: Filas subsiguientes que dependen de diferentes columnas de las filas anteriores<< Get Rows Where() devuelve una matriz de las filas que coinciden con los criterios de selección pasados a la función.
Entonces, cuando se encuentra que una fila tiene un valor para la columna "Solución usada para dilución" no está en blanco/falta,
- La variable de memoria, curRow, se establece en la fila actual, Row(), que se está procesando.En este caso, curRow se establecerá en 6.
- targetRow, debe establecerse en la fila que contiene la "Concentración dada" de la fila que tiene un valor coincidente en la columna "Letras", con el valor de fila actual para "Solución usada para dilución".
- Cuando se analiza, Obtener filas donde está:
<< get rows where(:Letters == :"C"])
La función permite que se devuelvan varias filas, por lo tanto, devuelve una matriz de todos los números de fila que coinciden con los criterios de selección.En nuestro caso, se devolverá una matriz de un solo elemento, y queremos el valor del primer elemento, que es 3, el número de fila para la fila, donde la columna Letras es igual a "C"
Re: Filas subsiguientes que dependen de diferentes columnas de las filas anteriores<< Obtener valores se usa para obtener los valores de la columna en una lista o matriz (depende del tipo de datos).
ubicación() se puede usar para obtener los índices de la matriz/lista que coinciden con el elemento que le proporcionamos O devolver índices de valores que no faltan (muy buena función para saber en mi opinión).
Loc devolverá una matriz, por lo que usamos N Items() para verificar si se encontraron índices para evitar problemas al acceder a los índices. Si no se encuentra ningún índice, establecemos el valor de esas filas como ".".
Según los datos proporcionados, elegí usar siempre el primer índice de los índices. Es posible utilizarlos todos si se necesitan cálculos más complicados en caso de coincidencias múltiples.
A continuación se muestra la creación de la fórmula con algunos comentarios.
Names Default To Here(1);
dt = New Table("Calculated concentration - Dummy table",
Add Rows(6),
Compress File When Saved(1),
New Column("Given Concentration", Numeric, "Continuous", Format("Best", 12), Set Property("Units", "ppm"), Set Values([12, 50, 23, 14, 2, .])),
New Column("Letters", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E", "F"}), Set Display Width(38)),
New Column("Used solution for dilution", Character, "Nominal", Set Values({"", "", "", "", "", "C"})),
New Column("Dilution Factor", Numeric, "Continuous", Format("Best", 12), Set Values([., ., ., ., ., 2.29837984]))
);
dt << New Column("Calculated Concentration (ppm)", Numeric, Continuous, Formula(
// use As Constant to evaluate this only once (should make it more efficient if you have lots of data)
As Constant(all_letters = :Letters << get values); // << get values gets values from column into a matrix or list
idx_for_letter = Loc(all_letters, :Used solution for dilution); // Loc can be used to return indices of matches in matrix but it has many other uses
If(N Items(idx_for_letter) == 0, // to avoid issues when trying to access incorrect indices, check for empty matrix
. // set missing value to column IF no indices found
,
:Given Concentration[idx_for_letter[1]] / :Dilution Factor // perform calculation using first index found from idx_for_letter
);
));
Para obtener una explicación sobre las funciones utilizadas, sugeriría usar primero el índice de secuencias de comandos para buscar la función y luego hacer clic en "Ayuda del tema" para acceder a la página de ayuda. Por ejemplo, busque "como constante"

y haga clic en la ayuda del tema para abrir esta página Como constante (expr)