Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernIch habe eine Datentabelle mit den Spalten „Zeit“ (numerisch, fortlaufend, formatiert im 12-Stunden-Format) und „Name“ (Charakter, lediglich eine Liste des Experiments, dem jeder Zeitpunkt zugeordnet ist). Wenn ich andere hier nicht erwähnte Spalten als Y-Achse und „Zeit“ als X-Achse verwende, tritt das Problem auf, dass jedes Diagramm zwischen den X-Gruppierungsvariablen verschoben wird, da die X-Achsenskala zwischen den X-Gruppierungsvariablen gleich bleibt (Abbildung 1).

Abbildung 1. Jede X-Gruppierungsvariable ist eine Spaltenvariable „Name“, wobei „Name“ auch als Overlay dient.
Meine Idee ist, ein Skript zu schreiben, um:
1. Erstellen Sie eine neue Spalte
2. Codieren Sie die neue Spalte mit einer Formel, die die Spalte „Zeit“ in die Zeit in Sekunden umwandelt, beginnend bei „0“ und in einem angegebenen Intervall (in diesem Fall 2 Sekunden) hochzählend, und auf 0 zurückgesetzt wird, sobald die Spalte „Name“ den Wert ändert.
Meine Hauptfragen sind:
1. Ist das möglich?
2. Gibt es eine einfachere Möglichkeit, dies zu tun, ohne eine neue Spalte zu erstellen?
Derzeit auf JMP 17.2.0 unter Windows 10.
Danke!
Datenexploration und -visualisierungBetreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernPrüfen Sie, ob es Ihren Anforderungen entspricht.
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernDanke für die Antwort!
Leider wird dadurch die Spalte „Verstrichene Zeit“ zurückgegeben, die in der folgenden Abbildung zu sehen ist.

Ich habe den folgenden Code ausprobiert, der ebenfalls die Spalte „Zeit (s)“ in der obigen Abbildung ergab. Es scheint, als würde er die Funktion „Initial auf Null setzen“ ausführen, aber sonst nichts konvertieren.
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
);
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernMöglicherweise ist etwas Unerwartetes an Ihrer Spalte „LocalTime“ zu erkennen. Ich habe meine Formel an einer frei erstellten Tabelle ausprobiert, und sie funktionierte wie vorgesehen. Wie ist Ihre Spalte „LocalTime“ formatiert?

Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernIch habe eine Beispieldatentabelle erstellt

Und dann habe ich das folgende JSL ausgeführt
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
)
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Ich habe die folgende Ausgabe erhalten

Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernOkay, egal, der Code, den ich gepostet habe, hat tatsächlich funktioniert! Ich hatte meinen Spaltennamen falsch geschrieben:confounded_face:
Die einzige verbleibende Frage wäre dann, ob es einen einfacheren Weg gibt, dies zu tun, ohne eine neue Spalte zu erstellen?
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernEs ist eine neue Spalte erforderlich. Es muss keine persistente Spalte sein, d. h. es kann eine Spalte sein, die nur existiert, solange das Diagramm vorhanden ist.
Graph Builder(
Transform Column(
"Time (s)",
Formula( :LocalTime - Col Min( :LocalTime, :Name ) )
),
Show Control Panel( 0 ),
Variables( X( :"Time (s)"n ), Y( :Y Column ), Group X( :Name ) ),
Elements( Smoother( X, Y, Legend( 8 ) ) )
);
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernSie können beim Ausführen des Graph Builders immer eine Transform-Spalte (virtuell) verwenden. So benötigen Sie keine tatsächliche Spalte in Ihrer Datentabelle.
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernDas ist perfekt. Vielen Dank an dich und @txnelson für die tollen Lösungen!
Betreff: Konvertieren von Zeit in Zeitintervalle und Zurücksetzen basierend auf den Werten der zweiten Spalte, um einen Versatz der X-Achse zu verhindernNebenbei bemerkt: Standardmäßig werden in JMP die Maßeinheiten in der Spalteneigenschaft „Einheiten“ angegeben. In Ihrem Fall wäre der Unterschied, dass der eigentliche Spaltenname „Zeit“ lautet. Standardmäßig wird der Wert der Einheiten jedoch in Klammern angezeigt, wodurch der angezeigte Wert in „Zeit (s)“ geändert wird.