Valeurs non manquantes précédentes et suivantes dans une colonneJe suis relativement nouveau sur JMP et j'ai rencontré un problème avec lequel j'ai vraiment du mal. 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[ligne] == max(Signal[ligne-n, ligne +n]), sinon il manque. Mon problème, cependant, est le suivant : je souhaite créer une autre colonne de formule qui donne la distance entre chaque pic et le pic le plus proche.
En d’autres termes, je le souhaite, si « Peak ? == 1, recherchez la valeur de distance aux lignes précédente et suivante où « Peak ? » == 1, trouvez la valeur absolue de la différence entre la distance au niveau de la ligne actuelle et la distance au niveau de ces lignes, et obtenez le minimum de ces deux valeurs.
Jusqu'à présent, j'ai créé une « colonne d'assistance » 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 maximales du signal 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 pour tout conseil, que ce soit sur la façon de créer une formule pour cela, ou s'il existe de meilleures façons de résoudre le problème réel de la recherche de la distance minimale entre les sommets.
Analyse et modélisation des données de baseExploration et visualisation des donnéesRe : 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);
,
.
);
));

Re : 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 connexe, à vous ou à toute autre personne lisant ici.
Ensuite, je trouve 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 dans chacun, et grâce à l'aide fantastique de jthi, je peux maintenant trouver les distances minimales inter-pics du Signal 1 et du Signal 2. Existe-t-il une formule Je pourrais utiliser les sommets du signal 1 pour trouver la distance jusqu'au sommet le plus proche du signal 2 ? En d'autres termes, si vous utilisez l'image ci-jointe dans la réponse de jthi ci-dessus, ajoutez une colonne "Peaks2" et utilisez une formule pour que si "Peaks" ne manque pas, trouvez le minimum des valeurs absolues de la différence entre "Peaks" et les valeurs non manquantes précédentes et suivantes de « Peaks2 » ?
Re : 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 aisance en programmation, j'envisagerais peut-être de créer quelques fonctions car celles-ci peuvent rendre le code plus facile à comprendre (telles que "trouver la ligne précédente", "trouver la ligne suivante", "trouver la ligne la plus proche"). rangée",...).
Re : Valeurs non manquantes précédentes et suivantes dans une colonneMerci beaucoup encore une fois! Fonctionne tout aussi magnifiquement. Et je commence à comprendre votre code.
Merci pour le conseil. Comme je l'ai mentionné, je suis assez nouveau dans JMP, ainsi que dans la programmation en général. Mais je vais certainement garder cela à l’esprit, d’autant plus que j’acquérirai plus d’expérience. Merci encore, je vous souhaite tout le meilleur !