Le tableau 1 ressemble à
| patient | résultat du test 1 | résultat du test 2 | résultat du test 3 |
| 1001 | 1 | une | + |
| 1001 | 2 | b | + |
| 1002 | 1 | c | - |
| 1003 | 2 | ré | - |
Le tableau 2 ressemble à
| patient | événement indésirable |
| 1001 | aaa |
| 1002 | aab |
| 1002 | aac |
| 1002 | aad |
| 1003 | bbb |
| 1003 | bbc |
Le résultat que je veux obtenir ressemble à
patient colonne est une 'colonne partagée' pour ces deux tables)
| patient | résultat du test 1 | résultat du test 2 | résultat du test 3 | événement indésirable |
| 1001 | 1 | une | + | aaa |
| 1001 | 2 | b | + | |
| 1002 | 1 | c | - | aab |
| | | | | aac |
| | | | | aad |
| 1003 | 2 | ré | - | bbb |
| | | | | bbc |
Quelqu'un pourrait-il me fournir une solution (aussi simple que possible)?
Merci
La tâche peut être accomplie en ajoutant une colonne de compteur aux deux tables, en comptant chacun des nombres de valeurs répétées du patient
Ensuite, la jointure peut être effectuée, en faisant correspondre le patient et le compteur
Enfin, le tri des données à la valeur de tri du patient et un petit nettoyage de la tâche sont réalisés

Voici le JSL pour obtenir les résultats, mais chaque tâche dans le JSL peut facilement être effectuée de manière interactive
Names Default To Here( 1 );
// Create example data tables
dt1 = New Table( "Table1",
Add Rows( 4 ),
New Column( "patient", character, Set Values( {"1001", "1001", "1002", "1003"} ) ),
New Column( "assay result 1", Character, "Nominal", Set Selected, Set Values( {"1", "2", "1", "2"} ) ),
New Column( "assay result 2", Character( 16 ), "Nominal", Set Values( {"a", "b", "c", "d"} ) ),
New Column( "assay result 3", Character( 16 ), "Nominal", Set Values( {"+", "+", "-", "-"} ) )
);
dt2 = New Table( "Table2",
Add Rows( 6 ),
New Column( "patient", Character, Set Values( {"1001", "1002", "1002", "1002", "1003", "1003"} ) ),
New Column( "adverse event", Character( 16 ), "Nominal", Set Values( {"aaa", "aab", "aac", "aad", "bbb", "bbc"} ) )
);
dt1 << New Column( "counter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( Row() == 1, c = 1 );
If( Lag( :patient ) != :patient,
c = 1,
c
++);
c;
)
);
// Add a counter column to both data tables
dt2 << New Column( "counter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( Row() == 1, c = 1 );
If( Lag( :patient ) != :patient,
c = 1,
c
++);
c;
)
);
// Join the tables matching upon patient and counter
dt3 = dt1 << Join(
With( dt2 ),
Merge Same Name Columns,
By Matching Columns( :patient = :patient, :counter = :counter ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 1 ),
Preserve main table order( 1 )
);
// Sort the data into patient order
dt3 << sort( by( :patient, :counter ), order( ascending, ascending ), replace table( 1 ) );
// If the data came from only the "With" data table, delete the patient value
dt3:patient[dt3 << get rows where( :match flag == 2 )] = "";
// Clean up the table
dt3 << delete columns( {:Match Flag, :counter} );
salut @VBIR ,
Comme @txnelson mentionné, pour que le tableau ressemble exactement à ce que vous avez montré, vous devrez effectuer un script ou plusieurs étapes interactives. Cependant, les tables JMP ne sont pas vraiment conçues pour afficher les données de cette manière. Ce sont des tables de données, pas des feuilles de calcul, donc la jointure simple ressemblerait à ceci du point de vue d'une table de données JMP

En effet, les tableaux JMP sont utilisés à des fins analytiques et graphiques, alors que les feuilles de calcul servent à créer des résumés numériques plus faciles à lire. Dans le monde des essais cliniques, les données sont généralement stockées de la manière indiquée dans l'image, mais peuvent être affichées plus comme ce que vous avez montré.
Cela conduit à la question suivante, quel est votre objectif en affichant les données jointes de la manière que vous nous avez indiquée? Est-ce à des fins de rapport ou prévoyez-vous de faire un graphique ou une analyse supplémentaire avec le résultat?
Oh, j'ai oublié de mentionner que lors de la mesure d'un test plusieurs fois pour un patient, chaque mesure devrait vraiment avoir son propre identifiant pour s'assurer qu'il y a un alignement correct des événements indésirables (qui auraient un identifiant correspondant) à chaque mesure sans confusion possible ( comme dans mon exemple, l'événement indésirable aaa a été répété pour le patient 1001, mais n'aurait pas dû l'être, je suppose.
Typiquement, un horodatage (ou jour d'étude) pour l'événement indésirable et un horodatage (ou jour d'étude) pour chaque mesure pour chaque test. De cette façon, si les événements indésirables sont censés ne concerner qu'une seule des mesures rapportées pour chaque test, il sera correctement affiché. Idem pour plusieurs événements indésirables pour le même jour que le résultat du test a été enregistré. Par exemple:
Tableau 1
| Patient |
Journée d'étude |
Essai 1 |
Essai 2 |
Essai 3 |
| 1001 |
1 |
1 |
une |
+ |
| 1001 |
2 |
2 |
b |
+ |
Tableau 2
| Patient |
Journée d'étude |
Événement indésirable |
| 1001 |
1 |
aaa |
| 1001 |
2 |
|
Tableau 3 (jointure simple avec le patient et le jour de l'étude comme colonnes correspondantes et en utilisant la non-correspondance incluse dans les deux tableaux)
| Patient |
Journée d'étude |
Essai 1 |
Essai 2 |
Essai 3 |
Événement indésirable |
| 1001 |
1 |
1 |
une |
+ |
aaa |
| 1001 |
2 |
2 |
b |
+ |
|
Cela évite les affectations accidentelles ambiguës qui pourraient être faites et permet une utilisation dans JMP pour une analyse et une représentation graphiques plus poussées. De plus, la ligne 2 du tableau 2 n'est pas vraiment nécessaire lors de l'adhésion, car on supposerait qu'il n'y a pas d'événements le jour d'étude 2.
@chris_kirchberg merci pour votre patience et vos réponses très détaillées!
J'aurais dû noter que c'est un exemple que j'ai fait de rien.
Je veux juste créer un tableau qui ressemble à cet exemple pour d'autres coéquipiers de programmation afin qu'ils puissent comparer LB et AE en faisant défiler facilement l'écran.