Datumsunterschiede in zwei DatensätzenHallo,
Ich habe zwei Datensätze zu einer Kohorte von Patienten.Einer hat Testdaten „a“ und der andere hat Testdaten „b“. Die Anzahl der Tests a und b zu einem Thema variiert (d. h. einige haben viele Tests a und wenige b oder umgekehrt).
Ich muss alle Fälle finden, in denen die Tests a und b innerhalb eines Zeitrahmens liegen (90 Tage für dieses Projekt).Wie könnte ich den Vergleich aller Kombinationen von Test a und b automatisieren, um die Tests innerhalb dieses Parameters zu finden?Anders ausgedrückt: Wie vergleiche ich jedes Test-A-Datum mit allen Test-B-Datumsdaten, um eine Datumsdifferenz zu berechnen (und diese <90d zu isolieren)?Wenn ich nur eine Liste aller Datums-Diff-Kombinationen erhalte, kann ich sie leicht sortieren, um diese <90d zu finden
Beispiel unten
DATENSATZ1
Betreff # Test Ein Datum
1.1.23
1 2.1.23
1 3.1.23
1 4.1.23
2 2.1.10
2 5/1/10
DATENSATZ2
Betreff Nr. Test B-Datum
1 1.1.14
1 01.06.23
1 1.11.22
2 1.1.10
2.1.23
2. 1.5.23
ERGEBNISSE
Subjekttest A Datum Test B Datum Datum Diff
1 1.1.23 1.11.22 60d
1 01.03.23 01.06.23 90d
2 2.1.10 1.1.10 30 Tage
Datenmischung und -bereinigungBetreff: Datumsunterschiede in zwei DatensätzenIch würde versuchen, die Datensätze nach Themen zusammenzuführen und dann die Funktion „Datedifference“ zu verwenden, um die Unterschiede zwischen Tests A und Tests B zu berechnen.Mir ist etwas unklar, ob Sie alle Unterschiede für alle Testpaare oder nur den minimalen oder maximalen Unterschied wollen.Wenn es sich um das Minimum oder das Maximum handelt, sollten Sie in der Lage sein, neue Spalten für die frühesten und/oder spätesten Daten für die Tests A und B zu erstellen, bevor Sie die Datumsdifferenz berechnen.Wenn Sie alle Unterschiede möchten, müssen Sie möglicherweise Ihren Datensatz neu strukturieren (z. B. durch Stapeln der Test-A- und Test-B-Spalten nach dem Zusammenführen der Datensätze), bevor Sie die Datumsunterschiede berechnen.
Betreff: Datumsunterschiede in zwei DatensätzenIm Anhang finden Sie die drei Datensätze für Ihr Beispiel oben.Ich bin mir nicht sicher, was Sie mit Ihrer Ergebnistabelle meinen – es gibt mehr Übereinstimmungen, als Sie anzeigen.Wenn es sich also um eine Kurzform von dem handelt, was ich angehängt habe, sollte dies für Sie funktionieren.Wenn Sie wirklich nur diese drei Übereinstimmungen und Unterschiede in Ihren Ergebnissen sehen wollten, dann verstehe ich nicht, wie Sie die gewünschten Übereinstimmungen auswählen.
Betreff: Datumsunterschiede in zwei DatensätzenIch glaube das
Tables=>Join macht, was Sie wollen.

Hier ist ein Skript, das Ihre beiden Beispieltabellen erstellt, sie dann zusammenfügt und alle Zeilen mit Datumsunterschieden von mehr als 90 hervorhebt.
Names Default To Here( 1 );
dt1 = New Table( "Dataset1",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "1", "2", "2"} )
),
New Column( "Test A Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3755376000, 3758054400, 3760473600, 3763152000, 3347827200, 3355516800] )
)
);
dt2 = New Table( "Dataset2",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "2", "2", "2"} )
),
New Column( "Test B Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3471379200, 3768422400, 3750105600, 3345148800, 3755376000, 3755721600] )
),
Set Row States( [1, 0, 0, 0, 0, 0] )
);
// The code below is the code that does the work.
dtFinal = dt1 << Join(
With( dt2 ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :Subject = :Subject ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "Final" )
);
dtFinal << New Column( "Date Diff in Days", formula( Abs( :Test A Date - :Test B Date ) / In Days( 1 ) ) );
dtFinal << select where(:Date Diff in Days > 90 );
Betreff: Datumsunterschiede in zwei DatensätzenIch habe das Gleiche wie Sie erhalten, bis auf zwei Punkte: Ich habe die Differenz in Monaten und nicht in Tagen berechnet (ein Versehen – Tage machen mehr Sinn), und Sie haben den absoluten Wert der Differenz verwendet.Dieser Faktor geht aus der Anfrage nicht hervor – ich würde mir normalerweise vorstellen, dass die Tests sequentiell sind (A vor
, aber wenn man bedenkt, dass einige der B-Tests vor den A-Tests gingen, ist der absolute Wert meiner Meinung nach sinnvoller.
Betreff: Datumsunterschiede in zwei DatensätzenMein Ziel ist es, Probanden für eine Studie zu isolieren, bei denen die Tests a und b innerhalb von 90 Tagen durchgeführt werden.In meinen Ergebnissen werden nur die Testpaare mit <=90d dazwischen aufgeführt, da dies das gewünschte Ergebnis wäre.
Betreff: Datumsunterschiede in zwei DatensätzenAlso wird entweder meine Lösung oder die von Txnelson funktionieren (er ist der Codierungsassistent, ich benutze einfach meine Maus).Sobald Sie die Datumsunterschiede berechnet haben, wählen Sie einfach die Tage < 90 aus oder erstellen Sie eine Spalte, in der die Tage < 90 mit einem Indikator (z. B. 1 vs. 0) gekennzeichnet werden.
Betreff: Datumsunterschiede in zwei DatensätzenIch habe auch ein Add-In geschrieben, das dafür verwendet werden könnte (die Verwendung ist umständlich und die Automatisierung könnte etwas schwierig sein, sollte aber möglich sein). Nächste Zeilen verknüpfen – Verknüpfen Sie Tabellen mithilfe von fortlaufenden Spalten und nächstgelegenen Werten . Ich hoffe, dass ich irgendwann Zeit habe, das noch einmal umzuschreiben
Die Toleranz ist auf 7776000 eingestellt, da JMP-Datumsangaben in Sekunden erfolgen. Die Verbindungsrichtung ist „Nächste“, da wir rückwärts oder vorwärts verbinden können

und aus dem Ergebnis können Sie zusätzliche Zeilen ohne Übereinstimmungen entfernen

Nach etwas Aufräumen

Wenn Sie SQL kennen, könnten Sie das verwenden
Query(
Table(dt1, "dt1"),
Table(dt2, "dt2"),
"\[SELECT dt1.*, dt2."Test B Date", Abs(dt1."Test A Date" - dt2."Test B Date") / (24*60*60) DeltaDays
FROM dt1
join dt2 on dt1.subject = dt2.subject
where
Abs(dt1."Test A Date" - dt2."Test B Date") <= 90*24*60*60
]\"
);
Aber in diesem Fall denke ich, dass ich die interaktive Lösung von JMP verwenden und das von JMP für Sie erstellte Skript verwenden würde (nach Betreff zusammenfügen, neue Spalte basierend auf Datumsunterschieden hinzufügen (Rechtsklick-Menü kann dies tun), zweite Spalte hinzufügen, um zu prüfen, ob der Unterschied klein genug ist). , führen Sie eine darauf basierende Auswahl durch und entfernen Sie zusätzliche Zeilen). Beide @txnelson Und @dale_lehman habe das mehr oder weniger vorgeschlagen
Verbinden:

Erste Cormula-Spalte hinzufügen

Zweite Formel hinzufügen

Wählen Sie 0 Zeilen aus und löschen Sie diese

Endergebnis

JMP hat ein Skript erstellt (das sollte etwas aufgeräumt werden, guter Beitrag dazu Bessere, reibungslosere JSL-Migration: So reparieren Sie Ihren eigenen Code )
