Calculs entre les lignes en fonction des conditionsBonjour, je débute avec les scripts JMP, mais je suis un peu habitué au langage Python. J'essaie d'obtenir le résultat suivant avec ma table de test fictive ci-dessous :
1) Parcourez toutes les lignes (avant et après la ligne) et effectuez les calculs uniquement sur les lignes où Cuvette == 11, les lignes restantes où Cuvette != 11 la « Sortie » peut être définie sur NA ou autre.
2) Le calcul s'effectue entre deux lignes distinctes. Pour les lignes dont la cuvette est égale à 11, la cellule de 850 nm doit être divisée par la cellule de 250 nm de la ligne qui remplit deux conditions :
a) Cuvette == 12
b) La valeur de réussite doit correspondre entre les lignes, par exemple Valeur de réussite pour la cuvette 11 == Valeur de réussite pour la cuvette 12
| Passer |
850 nm |
250 nm |
Cuvette |
Sortir |
| 1 |
100 |
200 |
11 |
100/500 = 0,2 |
| 2 |
400 |
500 |
11 |
400 / 400 = 1 |
| 3 |
300 |
100 |
11 |
300 / 900 = 0,33 |
| 1 |
700 |
500 |
12 |
QUE |
| 2 |
200 |
400 |
12 |
QUE |
| 3 |
400 |
900 |
12 |
QUE |
| 1 |
400 |
800 |
13 |
QUE |
| 2 |
500 |
700 |
13 |
QUE |
| 3 |
300 |
700 |
13 |
QUE |
Automatisation et scriptsAnalyse et modélisation des données de baseRe : Calculs entre les lignes en fonction des conditionsPour ce faire à la manière de JMP, vous devez généralement diviser vos données, puis effectuer le calcul ( JMP n'est pas une feuille de calcul ), puis les joindre à nouveau ou continuer avec les données divisées.
Mais vous pouvez également utiliser JSL ou Formula pour effectuer ce calcul, mais considérez d'abord l'option de fractionnement.
Re : Calculs entre les lignes en fonction des conditionsBienvenue dans la communauté.
Voici un exemple de la façon dont j'aborderais votre problème

Names Default To Here( 1 );
dt = Current Data Table();
// Separate out the Cuvette==12 rows into a separate data table
// and then join the Pass==Pass rows to the Cuvette==11 rows
// Then calculate the Output column
// Select the Cuvette==12 rows
dt << Select Where( :Cuvette == 12 );
// Create a new subsetted data table with those rows
dt12 = dt << Subset( Selected Rows( 1 ), columns( :Pass, :"250 nm"n ) );
// Change 250 nm column name so when joined back to original table
// it will have a unique column name
dt12:"250 nm"n << Set Name( "Divisor" );
// For alignment reasons, add a new column called Cuvette and set
// it equal to 11
dt12 << New Column( "Cuvette", Set Each Value( 11 ) );
// Join the tables using the Update Platform
dt << Update(
With( dt12 ),
Match Columns( :Pass = :Pass, :Cuvette = :Cuvette )
);
// Create the new Output column
dt << New Column( "Output", Set Each Value( :"850 nm"n / :Divisor ) );
// Remove Divisor column since it is no longer needed
dt << delete columns( Divisor );
// Close the subsetted data table since it is no longer needed
Close( dt12, nosave );
// Remove the Selected RowStates from the data table
dt << clear rowstates;
Voici une approche plus directe, mais beaucoup moins efficace, qui produit les mêmes résultats. Sur une table de données volumineuse, cette méthode sera assez lente.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Output",
Formula(
foundRow = [];
If( :Cuvette == 11,
curPass = :Pass;
foundRow = Current Data Table() <<
get rows where( :Cuvette == 12 & :Pass == curPass );
If( N Items( foundRow ) > 0,
:"850 nm"n / :"250 nm"n[foundRow[1]]
);
);
)
);
Re : Calculs entre les lignes en fonction des conditionsVoici une option de matrice, mais l'utilisation des fonctionnalités JMP est généralement plus facile à comprendre
Names Default To Here(1);
dt = Current Data Table();
cuvette_start = 11;
cuvette_end = 12;
cuvettes = dt[0, "Cuvette"];
// Data is sorted -> we can just take values and make comparison
start_idx = Loc(cuvettes, cuvette_start);
end_idx = Loc(cuvettes, cuvette_end);
// differences
output = J(1, N Rows(dt), .);
output[start_idx] = dt[start_idx, "850 nm"] :\</img> dt[end_idx, "250 nm"];
dt << new column("R", Numeric, Continuous, Values(output));
Si vous pouvez compter fortement sur l'ordre, vous pouvez utiliser une formule comme celle-ci
If(:Cuvette == 11,
:"850 nm"n / :"250 nm"n[Col Min(If(:Cuvette == 12, Row(), .)) + Row() - 1];
);
Le type de formule finale dépendra fortement de votre cas d'utilisation réel (les données sont-elles triées « correctement », recherchez-vous plus d'une comparaison de valeurs, etc.).