Le righe successive dipendono da colonne diverse dalle righe precedentiCiao - Sto lavorando con una serie di esperimenti in cui alcuni esperimenti dipendono da esperimenti precedenti (cioè sto mescolando soluzioni che ho fatto in precedenza per crearne di nuove). Sto cercando di creare una funzione in cui legge una colonna per ottenere il nome della soluzione precedente, cerca una seconda colonna per trovare la riga con quel nome, quindi prende il valore in una cella con quella riga e una terza colonna. Match sembra in qualche modo farlo, ma non riesco a farlo funzionare, e penso che sia in parte perché match si aspetta un livello esplicitamente dichiarato della colonna di ricerca, e forse altre cose di cui non mi rendo conto. Non ho alcuna esperienza in JSL e preferirei qualcosa come una funzione di colonna di corrispondenza, ma se JSL è ciò che serve, allora va benissimo.
Ho allegato una tabella fittizia che dovrebbe far capire il punto senza vedere tutte le mie altre colonne estranee. L'ultima colonna è quella con la formula che non funziona, ed ecco uno screenshot

e il codice per ciò che non funziona se è più facile da gestire:
Corrispondenza( :Nome soluzione, :Soluzione utilizzata per la diluizione, :Concentrazione data ) /
:Fattore di diluizione
Grazie in anticipo.
Automazione e scriptingfinestreRe: Righe successive dipendenti da colonne diverse dalle righe precedentiUn'opzione è usare qualcosa di simile per ottenere il file index
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
allora puoi usare Abbonamento tabella dati per accedere al valore nella riga specifica della riga. Quindi la formula finale è qualcosa del genere
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Re: Righe successive dipendenti da colonne diverse dalle righe precedentiEcco la formula che ho trovato.Potrebbe essere semplificato, ma nella sua forma attuale sembra funzionare.
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: Righe successive dipendenti da colonne diverse dalle righe precedentiEHI @jthi - Ha funzionato! Solo così capisco la logica, dato che questa è la prima volta che interagisco con JSL, e preferirei non dedurre completamente cosa sta succedendo:
1. :Column1 << Get Values crea un elenco temporaneo identico nel contenuto e nell'ordine a :Column1.
2. Loc(:Column2 << Get Values, :Column2) fornisce quindi un elenco ordinato di tutti i numeri di riga in cui :Column1 corrisponde al contenuto di ogni riga in :Column2. Lo assegniamo a row_idx.
All'interno dell'istruzione if,
3. N Items( row_idx ) < 1 dice che se la lista è nulla (cioè non ci sono corrispondenze), la rendiamo vuota mettendo un "." In,
4. Se ci sono voci maggiori o uguali a 1 nell'elenco row_idx, :Column3[row_idx[1]] è un indice di un indice, dove prendiamo la prima voce nell'elenco row_idx, usa quella voce come l'ennesima voce di :Colonna3.
È questo il succo?
Grazie per lavorare su questo!
Re: Righe successive dipendenti da colonne diverse dalle righe precedenti@txnelson Grazie per il codice; anche il tuo ha funzionato! Non ho alcuna esperienza con JSL, nessuno ha lavorato solo con VBA e Matlab, quindi mi piace @jthi , Voglio capire. Quindi, per essere sicuro di aver capito
1.x=. definisce solo una variabile vuota x.
2. Se ci sono celle da :Soluzione usata per la diluizione nella stessa riga di quella in corso di valutazione che non sono vuote =>
3. curRow = Row() definisce curRow come il numero di riga corrente
4. ottieni righe dove(
:Nome soluzione == :Soluzione utilizzata per la diluizione[curRow]
))[1]
prende il valore delle soluzioni :Used per la diluizione per la riga corrente utilizzandolo come indice, e "get[s] row[numbers] where" quei valori sono identici a quelli in :Solution.
5. targetRow = (Current Data Table() << ottiene righe where(... quindi crea una matrice dalle righe determinate nel passaggio 3, il pedice 1 afferra la prima voce in questa matrice, .
6. Infine x viene riempito dividendo la riga di :Data Concentration che abbiamo specificato in 4, per il :Dilution Factor nella riga corrente, specificato in 3.
7. Restituiamo "x" alla cella.
La mia unica domanda è dal passaggio 5, penserei che targetRow sia un elenco di ciascuna voce nella riga che vogliamo, ma poi affinché il passaggio sei funzioni deve restituire il numero di riga effettivo. Penso di aver frainteso il modo in cui Current Data Table () << ottiene le righe where(... works. Potresti approfondire?
Grazie ancora per aver dedicato del tempo!
Re: Righe successive dipendenti da colonne diverse dalle righe precedenti<< Get Rows Where() restituisce una matrice delle righe che corrispondono ai criteri di selezione passati alla funzione.
Quindi, quando si scopre che una riga ha un valore per la colonna "Soluzione utilizzata per la diluizione" non è vuota/mancante,
- La variabile di memoria, curRow, è impostata sulla riga corrente, Row(), che viene elaborata.In questo caso, curRow sarà impostato su 6.
- targetRow, deve essere impostato sulla riga che contiene la "Concentrazione data" dalla riga che ha un valore corrispondente nella colonna "Lettere", con il valore della riga corrente per "Soluzione utilizzata per la diluizione".
- Quando viene analizzato, Get Rows Where è:
<< get rows where(:Letters == :"C"])
La funzione consente di restituire più righe, quindi restituisce una matrice di tutti i numeri di riga che corrispondono ai criteri di selezione.Nel nostro caso, verrà restituita una matrice a elemento singolo e vogliamo il valore del primo elemento, che è 3, il numero di riga per la riga, dove la colonna Lettere è uguale a "C"
Re: Righe successive dipendenti da colonne diverse dalle righe precedenti<< Ottieni valori viene utilizzato per ottenere i valori dalla colonna in un elenco o matrice (dipende dal tipo di dati).
Loc() può essere utilizzato per ottenere gli indici dalla matrice/lista che corrispondono all'elemento che gli forniamo O indici di ritorno di valori non mancanti (ottima funzione da sapere secondo me).
Loc restituirà una matrice, quindi usiamo N Items() per verificare se sono stati trovati indici per evitare problemi durante l'accesso agli indici. Se non viene trovato alcun indice, impostiamo il valore per quelle righe come ".".
Sulla base dei dati forniti, ho scelto di utilizzare sempre il primo indice degli indici. È possibile utilizzarli tutti se fossero necessari calcoli più complicati in caso di più corrispondenze.
Di seguito è riportata la creazione della formula con alcuni commenti
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
);
));
Per ottenere spiegazioni sulle funzioni utilizzate, suggerirei prima di utilizzare Scripting Index per cercare la funzione e quindi fare clic su "Topic Help" per accedere alla pagina di aiuto. Ad esempio, cerca "as constant"

e fai clic sulla guida dell'argomento per aprire questa pagina Come Costante(espr)