Valeurs non manquantes précédentes et suivantes dans une colonneJe suis relativement nouveau sur JMP et je suis tombé sur un problème avec lequel je suis vraiment aux prises. J'utilise JMP Pro 17. J'ai une feuille de données avec une colonne avec la distance à partir d'un point de départ (« Distance ») et une colonne avec une valeur d'intensité du signal à cette distance (« Signal »). J'ai trouvé les maxima locaux du signal (pics) en créant une colonne de formule qui donne un 1 si la valeur du signal à cette distance est la plus grande valeur dans une plage donnée (Signal[row] == max(Signal[row-n, row+n]), sinon manquant. Mon problème, cependant, est le suivant : je souhaite créer une autre colonne de formule qui donne la distance à chaque pic jusqu'au pic le plus proche.
En d'autres termes, je souhaite, si « Peak ? » == 1, trouver la valeur de distance aux lignes précédentes et suivantes où « Peak ? » == 1, trouver la valeur absolue de la différence entre la distance à la ligne actuelle et la distance à ces lignes, et obtenir le minimum de ces deux valeurs.
Jusqu'à présent, j'ai créé une « colonne d'aide » qui, si la ligne contient un maximum de signal local, donne la distance à cette valeur. En d'autres termes, j'ai une colonne avec les valeurs de distance aux valeurs de signal de pointe et les valeurs manquantes dans toutes les lignes qui ne sont pas des pics. Cependant, je ne trouve pas de moyen de définir par formule « valeur non manquante précédente » ou « valeur non manquante suivante ». Je serais extrêmement reconnaissant de tout conseil, soit sur la façon de créer une formule pour cela, soit sur les meilleurs moyens de résoudre le problème réel de la recherche de la distance minimale entre les pics.
Analyse et modélisation de données de baseExploration et visualisation des donnéesRé: Valeurs non manquantes précédentes et suivantes dans une colonneMerci beaucoup encore une fois ! Cela fonctionne toujours aussi bien. Et je commence à comprendre votre code.
Merci pour le conseil. Comme je l'ai mentionné, je suis assez nouveau dans JMP, et aussi dans la programmation en général. Mais je vais certainement le garder à l'esprit, surtout à mesure que j'acquiers plus d'expérience. Merci encore, je vous souhaite bonne chance !
Ré: Valeurs non manquantes précédentes et suivantes dans une colonneUne idée similaire devrait toujours fonctionner
Voir plus...
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Peak1", Numeric, "Continuous",
Set Values([., 1, ., ., 2.5, ., ., ., ., 3.1, ., ., 2])
),
New Column("Peak2", Numeric, "Continuous",
Set Values([0.5, 0.9, ., 2, ., 4, ., ., ., ., ., 5, .])
)
);
dt << New Column("Peak1ToPeak1", Numeric, Continuous, Formula(
As Constant(m = :Peak1 << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peak1),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(m[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(m[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));
dt << New Column("Peak1ToPeak2", Numeric, Continuous, Formula(
As Constant(m = :Peak2 << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peak1),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(:Peak1[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(:Peak1[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));

En fonction de la manière dont vous utiliserez ces données et de votre degré de confort avec la programmation, j'envisagerais peut-être de créer quelques fonctions car elles peuvent rendre le code plus facile à comprendre (comme « trouver la ligne précédente », « trouver la ligne suivante », « trouver la ligne la plus proche »,...).
Ré: Valeurs non manquantes précédentes et suivantes dans une colonneMerci beaucoup !! Cela fonctionne à merveille. Je ferai de mon mieux pour parcourir et essayer de comprendre votre formule.
Si vous me le permettez, j'aimerais poser une question supplémentaire, plutôt liée, à vous ou à toute autre personne lisant ici.
Ensuite, je recherche la distance minimale entre les pics de deux canaux. C'est-à-dire que j'ai Distance, Signal 1 et Signal 2, j'ai trouvé les pics de chacun et, grâce à l'aide fantastique de jthi, je peux maintenant trouver les distances minimales entre les pics du Signal 1 et du Signal 2. Existe-t-il une formule que je pourrais utiliser pour trouver la distance entre les pics du Signal 1 et le pic le plus proche du Signal 2 ? En d'autres termes, si vous utilisez l'image jointe dans la réponse de jthi ci-dessus, ajoutez une colonne « Peaks2 » et utilisez une formule pour, si « Peaks » n'est pas manquant, trouver le minimum des valeurs absolues de la différence entre « Peaks » et les valeurs non manquantes précédentes et suivantes de « Peaks2 » ?
Ré: Valeurs non manquantes précédentes et suivantes dans une colonnePremière idée qui m'est venue à l'esprit donc ça a l'air assez compliqué
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("Peaks", Numeric, "Continuous",
Set Values([., 1, ., ., 2.5, ., ., ., ., 3.1, ., ., 2])
)
);
dt << New Column("DistanceToPeak", Numeric, Continuous, Formula(
As Constant(m = :Peaks << get values;
peak_rows = Loc(m);
peak_values = m[peak_rows];
);
If(!IsMissing(:Peaks),
peak_distances = peak_rows - Row();
previous_peak = Loc(peak_distances < 0);
If(N Items(previous_peak) == 0,
previous_distance = .;
,
previous_distance = Abs(m[Row()] - peak_values[Reverse(previous_peak)[1]]);
);
next_peak = Loc(peak_distances > 0);
If(N Items(next_peak) == 0,
next_distance = .;
,
next_distance = Abs(m[Row()] - peak_values[next_peak[1]]);
);
Min(previous_distance, next_distance);
,
.
);
));
