La tabla 1 parece
| paciente | resultado del ensayo 1 | resultado del ensayo 2 | resultado del ensayo 3 |
| 1001 | 1 | una | + |
| 1001 | 2 | segundo | + |
| 1002 | 1 | C | - |
| 1003 | 2 | re | - |
La tabla 2 parece
| paciente | acontecimiento adverso |
| 1001 | aaa |
| 1002 | aab |
| 1002 | aac |
| 1002 | aad |
| 1003 | bbb |
| 1003 | bbc |
El resultado que quiero obtener se parece a
paciente column es una 'columna compartida' para estas dos tablas)
| paciente | resultado del ensayo 1 | resultado del ensayo 2 | resultado del ensayo 3 | acontecimiento adverso |
| 1001 | 1 | una | + | aaa |
| 1001 | 2 | segundo | + | |
| 1002 | 1 | C | - | aab |
| | | | | aac |
| | | | | aad |
| 1003 | 2 | re | - | bbb |
| | | | | bbc |
¿Alguien podría darme una solución (lo más simple posible)?
Gracias
La tarea se puede lograr agregando una columna de contador a ambas tablas, contando cada uno de los valores repetidos del paciente que hay
Entonces se puede realizar la unión, haciendo coincidir el paciente y el contador.
Finalmente, clasificando los datos de nuevo según el valor de clasificación del paciente y haciendo una pequeña limpieza, la tarea se realiza

Aquí está el JSL para obtener los resultados, pero cada tarea dentro del JSL se puede realizar fácilmente de forma interactiva
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} );
Hola @VBIR ,
Como @txnelson mencionado, para que la tabla se vea exactamente como se muestra, tendría que realizar algunas secuencias de comandos o varios pasos interactivos. Sin embargo, las tablas JMP realmente no están diseñadas para mostrar datos de esa manera. Son tablas de datos, no hojas de cálculo, por lo que la combinación simple se vería así desde el punto de vista de la tabla de datos de JMP

Esto se debe a que las tablas JMP se utilizan con fines analíticos y gráficos, mientras que las hojas de cálculo sirven para hacer resúmenes numéricos más fáciles de leer. En el mundo de los ensayos clínicos, los datos normalmente se almacenan de la forma que se muestra en la imagen, pero es posible que se muestren más como lo que ha mostrado.
Entonces eso lleva a la siguiente pregunta, ¿cuál es su objetivo al mostrar los datos combinados de la manera que nos ha proporcionado? ¿Es para fines de informes o planea hacer algunos gráficos o análisis adicionales con el resultado?
Oh, me olvidé de mencionar, cuando se mide un ensayo varias veces para un paciente, cada medición debe tener su propia ID para asegurar que haya una alineación adecuada de los eventos adversos (que tendrían una ID coincidente) para cada medición sin posible confusión ( como en mi ejemplo, se repitió el evento adverso aaa para el paciente 1001, pero supongo que no debería haber sido así.
Por lo general, un sello de fecha y hora (o día del estudio) para el evento adverso y un sello de fecha y hora (o día del estudio) para cada medición para cada ensayo. De esa manera, si se supone que los eventos adversos son solo para una de las mediciones informadas para cada ensayo, se mostrará correctamente. Lo mismo para múltiples eventos adversos para el mismo día en que se registró el resultado del ensayo. Por ejemplo:
tabla 1
| Paciente |
Día de estudio |
Ensayo 1 |
Ensayo 2 |
Ensayo 3 |
| 1001 |
1 |
1 |
una |
+ |
| 1001 |
2 |
2 |
segundo |
+ |
Tabla 2
| Paciente |
Día de estudio |
Acontecimiento adverso |
| 1001 |
1 |
aaa |
| 1001 |
2 |
|
Tabla 3 (combinación simple con Paciente y Día del estudio como columnas coincidentes y usando la no coincidencia incluida de ambas tablas)
| Paciente |
Día de estudio |
Ensayo 1 |
Ensayo 2 |
Ensayo 3 |
Acontecimiento adverso |
| 1001 |
1 |
1 |
una |
+ |
aaa |
| 1001 |
2 |
2 |
segundo |
+ |
|
Esto evita asignaciones accidentales ambiguas que podrían realizarse y permite su uso en JMP para análisis y gráficos adicionales. Además, la fila 2 en la tabla 2 no es realmente necesaria al unirse porque se supondría que no hay eventos en el Día de estudio 2.
@chris_kirchberg gracias por su paciencia y respuestas muy detalladas!
Debería haber notado que este es un ejemplo que hice de la nada.
Solo quiero crear una tabla que se parezca a este ejemplo para otros compañeros de equipo de programación para que puedan comparar LB y AE desplazándose fácilmente por la pantalla.