La tabella 1 sembra
| paziente | risultato del test 1 | risultato del test 2 | risultato del test 3 |
| 1001 | 1 | un | + |
| 1001 | 2 | b | + |
| 1002 | 1 | c | - |
| 1003 | 2 | d | - |
La tabella 2 sembra
| paziente | evento avverso |
| 1001 | aaa |
| 1002 | aab |
| 1002 | aac |
| 1002 | aad |
| 1003 | bbb |
| 1003 | bbc |
Il risultato che voglio ottenere è simile a
paziente la colonna è una "colonna condivisa" per queste due tabelle)
| paziente | risultato del test 1 | risultato del test 2 | risultato del test 3 | evento avverso |
| 1001 | 1 | un | + | aaa |
| 1001 | 2 | b | + | |
| 1002 | 1 | c | - | aab |
| | | | | aac |
| | | | | aad |
| 1003 | 2 | d | - | bbb |
| | | | | bbc |
Qualcuno potrebbe fornirmi una soluzione (il più semplice possibile)?
Grazie
L'attività può essere eseguita aggiungendo una colonna contatore a entrambe le tabelle, contando ciascuno dei valori ripetuti di pazienti presenti
Quindi l'unione può essere eseguita, abbinando su paziente e contatore
Infine, riordinando i dati al valore di ordinamento del paziente e facendo una piccola pulizia, l'attività viene realizzata

Ecco il JSL per ottenere i risultati, ma ogni attività all'interno del JSL può essere facilmente eseguita in modo interattivo
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} );
Ciao @VBIR ,
Come @txnelson menzionato, per fare in modo che la tabella appaia esattamente come mostrato, è necessario eseguire alcuni script o più passaggi interattivi. Tuttavia, le tabelle JMP in realtà non sono progettate per visualizzare i dati in questo modo. Sono tabelle di dati, non fogli di calcolo, quindi il join semplice sarebbe simile a questo dal punto di vista della tabella di dati JMP

Questo perché le tabelle JMP vengono utilizzate per scopi analitici e grafici, mentre i fogli di calcolo servono per creare riepiloghi numerici più facili da leggere. Nel mondo della sperimentazione clinica, i dati vengono generalmente archiviati nel modo mostrato nell'immagine, ma potrebbero essere visualizzati in modo più simile a quello che hai mostrato.
Quindi questo porta alla domanda successiva, qual è il tuo obiettivo nel visualizzare i dati uniti nel modo che ci hai fornito? È per scopi di reportistica o hai intenzione di eseguire grafici o analisi aggiuntivi con il risultato?
Oh, ho dimenticato di menzionare, quando si misura più volte un'analisi per un paziente, ogni misurazione dovrebbe avere il proprio ID per assicurarsi che ci sia un corretto allineamento degli eventi avversi (che avrebbero un ID corrispondente) a ciascuna misurazione senza possibile confusione ( come nel mio esempio sono stati gli eventi avversi aaa ripetuti per il paziente 1001, ma presumo non avrebbe dovuto esserlo.
Tipicamente un timbro data-ora (o giorno di studio) per l'evento avverso e un timbro data-ora (o giorno di studio) per ogni misurazione per ogni analisi. In questo modo, se si suppone che gli eventi avversi riguardino solo una delle misurazioni riportate per ciascun dosaggio, verrà visualizzato correttamente. Lo stesso per più eventi avversi per lo stesso giorno in cui è stato registrato il risultato del test. Per esempio:
Tabella 1
| Paziente |
Giornata di studio |
Dosaggio 1 |
Dosaggio 2 |
Dosaggio 3 |
| 1001 |
1 |
1 |
un |
+ |
| 1001 |
2 |
2 |
b |
+ |
Tavolo 2
| Paziente |
Giornata di studio |
Evento avverso |
| 1001 |
1 |
aaa |
| 1001 |
2 |
|
Tabella 3 (unione semplice con il paziente e la giornata di studio come colonne corrispondenti e utilizzando la non corrispondenza inclusa da entrambe le tabelle)
| Paziente |
Giornata di studio |
Dosaggio 1 |
Dosaggio 2 |
Dosaggio 3 |
Evento avverso |
| 1001 |
1 |
1 |
un |
+ |
aaa |
| 1001 |
2 |
2 |
b |
+ |
|
Ciò impedisce assegnazioni accidentali ambigue che potrebbero essere eseguite e consente l'utilizzo in JMP per ulteriori analisi e grafici. Inoltre, la riga 2 nella tabella 2 non è realmente necessaria quando ci si iscrive perché si presume che non ci siano eventi nel giorno di studio 2.
@chris_kirchberg grazie per la pazienza e le risposte molto dettagliate!
Avrei dovuto notare che questo è un esempio che ho fatto dal nulla.
Voglio solo creare una tabella simile a questo esempio per altri compagni di squadra di programmazione in modo che possano confrontare LB e AE scorrendo facilmente lo schermo.