differenze di data in due set di datiCIAO,
Ho due set di dati su una coorte di pazienti.Uno ha le date del test “a” e l'altro ha le date del test “b”. il numero di test a e b su un argomento varia (ad esempio, alcuni hanno molti a e pochi b o viceversa)
Devo trovare tutti i casi in cui i test aeb rientrano in un intervallo di tempo (90 giorni per questo progetto).Come potrei automatizzare il confronto di tutte le combinazioni dei test aeb per trovare i test all'interno di questo parametro?In altre parole, come posso confrontare ogni data a del test con tutte le date del test b per calcolare una differenza di data (e isolare quelle <90d)?se ottengo solo un elenco di tutte le combinazioni data-diff posso facilmente ordinarle per trovarle <90d
Esempio qui sotto
SET DATI1
Oggetto n. Prova Una data
1 1/1/23
1 1/2/23
1 1/3/23
1 1/4/23
2 1/2/10
2 5/1/10
DATASET2
Oggetto n. Data del test B
1 1/1/14
1 1/6/23
1 1/11/22
2 1/1/10
2 1/1/23
25/1/23
RISULTATI
soggetto test a data test b data data diff
1 1/1/23 1/1/22 60d
1 3/1/23 6/1/23 90 gg
2 1/2/10 1/1/10 30gg
Combinazione e pulizia dei datiRi: differenze di data in due set di datiProverei a unire i set di dati per argomento e quindi a utilizzare la funzione datedifference per calcolare le differenze tra i test A e i test B.Non mi è chiaro se vuoi tutte le differenze per tutte le coppie di test o solo la differenza minima o massima.Se si tratta del minimo o del massimo, dovresti essere in grado di creare nuove colonne per le prime e/o le ultime date per i test A e B prima di calcolare la differenza di date.Se desideri tutte le differenze, potrebbe essere necessario ristrutturare il set di dati (magari impilando le colonne test A e test B dopo aver unito i set di dati) prima di calcolare le differenze di data.
Ri: differenze di data in due set di datiIn allegato sono riportati i 3 set di dati per l'esempio sopra.Non sono sicuro di cosa intendi con la tabella dei risultati: ci sono più corrispondenze di quelle che mostri.Quindi, se è un'abbreviazione di ciò che ho allegato, allora dovrebbe funzionare per te.Se davvero volevi solo quelle 3 corrispondenze e differenze mostrate nei tuoi risultati, allora non capisco come scegli le corrispondenze che desideri.
Ri: differenze di data in due set di datiCredo che il
Tabelle=>Unisci farà quello che vuoi.

Ecco uno script che crea le tue 2 tabelle di esempio, quindi le unisce ed evidenzia tutte le righe con differenze di data maggiori di 90.
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 );
Ri: differenze di data in due set di datiHo ottenuto la tua stessa cosa, tranne 2 elementi: ho calcolato la differenza in mesi anziché in giorni (una svista: i giorni hanno più senso) e tu hai utilizzato il valore assoluto della differenza.Questo fattore non è chiaro dalla richiesta: normalmente penserei ai test come sequenziali (A che precede
, ma dato che un numero di test B ha preceduto i test A, immagino che il valore assoluto abbia più senso.
Ri: differenze di data in due set di datiil mio obiettivo è isolare i soggetti da includere in uno studio che abbiano eseguito i test aeb entro 90 giorni l'uno dall'altro.I miei risultati elencano solo la coppia di test con <=90d in mezzo poiché quello sarebbe il risultato desiderato.
Ri: differenze di data in due set di datiQuindi funzionerà la mia soluzione o quella di txnelson (è il mago della codifica, io uso solo il mouse).Una volta calcolate le differenze di data, basta scegliere quelli < 90 giorni o creare una colonna che identifichi quelli <90 con un indicatore (ad esempio, 1 vs 0).
Ri: differenze di data in due set di datiHo anche scritto un componente aggiuntivo che potrebbe essere utilizzato a questo scopo (è complicato da usare e automatizzarlo potrebbe essere un po' difficile, ma dovrebbe essere possibile). Unisci le righe più vicine: unisci le tabelle utilizzando colonne continue e valori più vicini . Spero di avere tempo per riscriverlo prima o poi
La tolleranza è impostata su 7776000 poiché i tempi di JMP sono espressi in secondi. La direzione di unione è la più vicina in quanto possiamo unirci all'indietro o in avanti

e dal risultato puoi rimuovere righe extra senza corrispondenze

Dopo un po' di pulizia

Se conosci SQL potresti usarlo
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
]\"
);
Ma in questo caso penso che utilizzando la soluzione interattiva di JMP e prendendo lo script che JMP crea per te (unisciti per oggetto, aggiungi una nuova colonna in base alle differenze di data (il menu di scelta rapida può farlo), aggiungi una seconda colonna per verificare se la differenza è abbastanza piccola , esegui la selezione in base a quella e rimuovi le righe extra). Entrambi @txnelson E @dale_lehman lo ha più o meno suggerito
Giuntura:

Aggiunta della prima colonna della cormula

Aggiunta della seconda formula

Seleziona 0 righe ed eliminale

Risultato finale

Script creato da JMP (dovrebbe essere ripulito un po', buon post a riguardo Migliore migrazione JSL più fluida: come correggere il proprio codice )
