Vorherige und nächste nicht fehlende Werte in einer SpalteIch bin ziemlich neu bei JMP und bin auf ein Problem gestoßen, mit dem ich wirklich zu kämpfen habe. Ich verwende JMP Pro 17. Ich habe ein Datenblatt mit einer Spalte mit der Entfernung von einem Startpunkt („Entfernung“) und einer Spalte mit einem Signalintensitätswert bei dieser Entfernung („Signal“). Ich habe lokale Signalmaxima (Spitzen) gefunden, indem ich eine Formelspalte erstellt habe, die eine 1 ergibt, wenn der Signalwert bei dieser Entfernung der größte Wert innerhalb eines bestimmten Bereichs ist (Signal[Zeile] == max(Signal[Zeile-n, Zeile+n]), andernfalls fehlt sie. Mein Problem ist jedoch folgendes: Ich möchte eine weitere Formelspalte erstellen, die die Entfernung bei jeder Spitze zur nächsten Spitze angibt.
Mit anderen Worten: Ich möchte, wenn „Peak?“ == 1, den Distanzwert in der vorherigen und der nächsten Zeile ermitteln, in der „Peak?“ == 1 ist, den absoluten Wert der Differenz zwischen der Distanz in der aktuellen Zeile und der Distanz in diesen Zeilen ermitteln und das Minimum dieser beiden Werte ermitteln.
Bisher habe ich eine „Hilfsspalte“ erstellt, die, wenn die Zeile ein lokales Signalmaximum enthält, die Distanz bei diesem Wert angibt. Mit anderen Worten, ich habe eine Spalte mit den Distanzwerten bei Spitzensignalwerten und fehlenden Werten in allen Zeilen, die keine Spitzen sind. Ich kann jedoch keine Möglichkeit finden, „vorheriger nicht fehlender Wert“ oder „nächster nicht fehlender Wert“ per Formel zu definieren. Ich wäre für jeden Rat äußerst dankbar, entweder wie man eine Formel dafür erstellt oder ob es bessere Möglichkeiten gibt, das eigentliche Problem der Ermittlung der Mindestdistanz zwischen Spitzen zu lösen.
Grundlegende Datenanalyse und ModellierungDatenexploration und -visualisierungBetreff: Vorherige und nächste nicht fehlende Werte in einer SpalteNochmals vielen Dank! Funktioniert genauso wunderbar. Und ich fange an, Ihren Code zu verstehen.
Danke für den Rat. Wie ich bereits erwähnt habe, bin ich ziemlich neu bei JMP und auch beim Programmieren im Allgemeinen. Aber ich werde es auf jeden Fall im Hinterkopf behalten, vor allem, wenn ich mehr Erfahrung habe. Nochmals vielen Dank, ich wünsche Ihnen alles Gute!
Betreff: Vorherige und nächste nicht fehlende Werte in einer SpalteEine ähnliche Idee sollte immer noch funktionieren
Mehr anzeigen...
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);
,
.
);
));

Je nachdem, wie Sie diese Daten verwenden und wie gut Sie sich mit dem Programmieren auskennen, würde ich vielleicht die Erstellung einiger Funktionen in Betracht ziehen, da diese das Verständnis des Codes erleichtern können (z. B. „Vorherige Zeile suchen“, „Nächste Zeile suchen“, „Nächste Zeile suchen“ …).
Betreff: Vorherige und nächste nicht fehlende Werte in einer SpalteVielen Dank!! Es funktioniert wunderbar. Ich werde mein Bestes tun, um Ihre Formel durchzugehen und zu verstehen.
Wenn ich darf, würde ich Ihnen oder allen anderen, die hier die Leser sind, noch eine weitere, damit zusammenhängende Frage stellen.
Als Nächstes suche ich den Mindestabstand zwischen Spitzen in zwei Kanälen. Ich habe also Abstand, Signal 1 und Signal 2, habe die Spitzen in jedem gefunden und kann dank der fantastischen Hilfe von jthi jetzt die Mindestabstände zwischen den Spitzen von Signal 1 und Signal 2 ermitteln. Gibt es eine Formel, mit der ich an den Spitzen von Signal 1 den Abstand zur nächsten Spitze von Signal 2 ermitteln kann? Mit anderen Worten: Wenn ich das angehängte Bild in jthis Antwort oben verwende, füge ich eine Spalte „Spitzen2“ hinzu und verwende eine Formel, um, wenn „Spitzen“ nicht fehlt, das Minimum der absoluten Werte der Differenz zwischen „Spitzen“ und den vorherigen und nächsten nicht fehlenden Werten von „Spitzen2“ zu ermitteln?
Betreff: Vorherige und nächste nicht fehlende Werte in einer SpalteDas war die erste Idee, die mir in den Sinn kam, also sieht es ziemlich kompliziert aus.
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);
,
.
);
));
