différences de date dans deux ensembles de donnéesSalut,
J'ai deux ensembles de données sur une cohorte de patients.L’un a les dates du test « a » et l’autre les dates du test « b ». le nombre de tests a et b sur un sujet varie (c'est-à-dire que certains ont beaucoup de a et peu de b ou vice versa)
Je dois trouver tous les cas où les tests a et b se déroulent dans un délai (90 jours pour ce projet).Comment puis-je automatiser la comparaison de toutes les combinaisons de tests a et b pour trouver les tests dans ce paramètre ?En d'autres termes, comment puis-je comparer chaque date de test a à toutes les dates de test b pour calculer une différence de date (et isoler celles <90j) ?si je reçois juste une liste de toutes les combinaisons date-diff, je peux facilement trier pour trouver celles <90d
Exemple ci-dessous
JEU DE DONNÉES1
Sujet # Test A date
1 1/1/23
1 2/1/23
1 3/1/23
1 4/1/23
2 1/2/10
2 01/05/10
JEU DE DONNÉES2
Sujet # Date du test B
1 1/1/14
1 6/1/23
1 1/1/22
2 1/1/10
2 1/1/23
2 1/5/23
RÉSULTATS
sujet test a date test b date date diff
1 1/1/23 11/1/22 60j
1 1/3/23 6/1/23 90j
2 1/2/10 1/1/10 30j
Mélange et nettoyage des donnéesRe : différences de date dans deux ensembles de donnéesJ'essaierais de joindre les ensembles de données par sujet, puis d'utiliser la fonction datedifference pour calculer les différences entre les tests A et les tests B.Je ne sais pas vraiment si vous voulez toutes les différences pour toutes les paires de tests ou simplement la différence minimale ou maximale.S'il s'agit du minimum ou du maximum, vous devriez pouvoir créer de nouvelles colonnes pour les dates les plus anciennes et/ou les plus récentes pour les tests A et B avant de calculer la différence de date.Si vous souhaitez connaître toutes les différences, vous devrez peut-être restructurer votre ensemble de données (peut-être en empilant les colonnes de test A et de test B après avoir joint les ensembles de données) avant de calculer les différences de date.
Re : différences de date dans deux ensembles de donnéesVous trouverez ci-joint les 3 ensembles de données pour votre exemple ci-dessus.Je ne suis pas sûr de ce que vous entendez par votre tableau des résultats : il y a plus de correspondances que vous n'en montrez.Donc, s'il s'agit d'un abrégé de ce que j'ai joint, cela devrait fonctionner pour vous.Si vous vouliez vraiment que ces 3 correspondances et différences soient affichées dans vos résultats, alors je ne comprends pas comment vous choisissez les correspondances que vous souhaitez.
Re : différences de date dans deux ensembles de donnéesje crois que
Tables=>Join fera ce que vous voulez.

Voici un script qui crée vos 2 exemples de tables, puis les réunit et met en évidence toutes les lignes avec des différences de date supérieures à 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 );
Re : différences de date dans deux ensembles de donnéesJ'ai eu la même chose que toi, à l'exception de 2 éléments : j'ai calculé la différence en mois plutôt qu'en jours (un oubli - les jours ont plus de sens), et tu as utilisé la valeur absolue de la différence.Ce facteur n'est pas clair dans la demande - je considérerais normalement les tests comme séquentiels (A précédant
, mais étant donné qu'un certain nombre de tests B ont précédé les tests A, je suppose que la valeur absolue a plus de sens.
Re : différences de date dans deux ensembles de donnéesmon objectif est d'isoler les sujets à inclure dans une étude qui ont subi les tests a et b à moins de 90 jours d'intervalle.Mes résultats ne répertorient que la paire de tests avec <=90d entre les deux, car ce serait le résultat souhaité.
Re : différences de date dans deux ensembles de donnéesDonc, soit ma solution, soit celle de txnelson fonctionnera (c'est l'assistant de codage, j'utilise juste ma souris).Une fois que vous avez calculé les différences de dates, choisissez simplement ces <90 jours ou créez une colonne identifiant ceux <90 avec un indicateur (par exemple, 1 contre 0).
Re : différences de date dans deux ensembles de donnéesJ'ai également écrit un complément qui pourrait être utilisé pour cela (c'est difficile à utiliser et l'automatiser peut être un peu difficile, mais cela devrait être possible). Rejoindre les lignes les plus proches - Joignez des tables en utilisant des colonnes continues et des valeurs les plus proches . J'espère avoir le temps de réécrire ceci à un moment donné
La tolérance est définie sur 7776000 car les dates et heures JMP sont en secondes. La direction de jointure est la plus proche car nous pouvons nous joindre en arrière ou en avant

et à partir du résultat, vous pouvez supprimer des lignes supplémentaires sans correspondance

Après un peu de nettoyage

Si vous connaissez SQL, vous pouvez l'utiliser
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
]\"
);
Mais dans ce cas, je pense utiliser la solution interactive de JMP et prendre le script que JMP crée pour vous (rejoindre par sujet, ajouter une nouvelle colonne basée sur les différences de date (le menu contextuel peut le faire), ajouter une deuxième colonne pour vérifier si la différence est suffisamment petite. , effectuez une sélection en fonction de cela et supprimez les lignes supplémentaires). Les deux @txnelson et @dale_lehman a plus ou moins suggéré cela
Rejoindre:

Ajout de la première colonne cormula

Ajout d'une deuxième formule

Sélectionnez 0 lignes et supprimez-les

Résultat final

Script créé par JMP (cela devrait être un peu nettoyé, bon article à ce sujet Meilleure migration JSL plus fluide : comment corriger votre propre code )
