表 1 看起来像
| 病人 | 化验结果1 | 化验结果2 | 化验结果3 |
| 1001 | 1 | A | + |
| 1001 | 2 | 乙 | + |
| 1002 | 1 | C | - |
| 1003 | 2 | d | - |
表 2 看起来像
| 病人 | 不良事件 |
| 1001 | 啊啊 |
| 1002 | 阿布 |
| 1002 | 亚克 |
| 1002 | 阿德 |
| 1003 | bbb |
| 1003 | 英国广播公司 |
我想要得到的结果看起来像:(病人列是这两个表的“共享列”)
| 病人 | 化验结果1 | 化验结果2 | 化验结果3 | 不良事件 |
| 1001 | 1 | A | + | 啊啊 |
| 1001 | 2 | 乙 | + | |
| 1002 | 1 | C | - | 阿布 |
| | | | | 亚克 |
| | | | | 阿德 |
| 1003 | 2 | d | - | bbb |
| | | | | 英国广播公司 |
有人可以为我提供一个解决方案(尽可能简单)吗?
谢谢
@克里斯_基希伯格感谢您的耐心和非常详细的解答!
我应该指出,这是我凭空捏造的一个例子。
我只是想为其他编程队友创建一个类似于此示例的表格,以便他们可以通过轻松滚动屏幕来比较 LB 和 AE。
哦,我忘了提及,当对患者进行多次检测时,每次测量确实应该有自己的 ID,以确保不良事件(将具有匹配的 ID)与每次测量正确对齐,而不会造成混淆(就像在我的例子中,不良事件 aaa 对患者 1001 重复出现,但我认为不应该重复。
通常,不良事件的日期时间戳(或研究日)和每次测定的每次测量的日期时间戳(或研究日)。 这样,如果不良事件仅针对每次测定报告的测量之一,则它将正确显示。 对于记录测定结果的同一天的多个不良事件也是如此。 例如:
表格1
| 病人 |
学习日 |
测定1 |
测定2 |
测定3 |
| 1001 |
1 |
1 |
A |
+ |
| 1001 |
2 |
2 |
乙 |
+ |
表2
| 病人 |
学习日 |
不良事件 |
| 1001 |
1 |
啊啊 |
| 1001 |
2 |
|
表 3(简单连接患者和研究日作为匹配列并使用两个表中包含的不匹配项)
| 病人 |
学习日 |
测定1 |
测定2 |
测定3 |
不良事件 |
| 1001 |
1 |
1 |
A |
+ |
啊啊 |
| 1001 |
2 |
2 |
乙 |
+ |
|
这可以防止可能发生的不明确的意外分配,并允许在 JMP 中使用以进行进一步的分析和绘图。 此外,加入时并不真正需要表 2 中的第 2 行,因为假设研究第 2 天没有事件。
你好@VBIR ,
作为@tx尼尔森如上所述,要使表格看起来与您显示的完全一样,您必须执行一些脚本或多个交互步骤。 然而,JMP 表格实际上并不是为了以这种方式显示数据而设计的。 它们是数据表,而不是电子表格,因此从 JMP 数据表的角度来看,简单的联接如下所示

这是因为 JMP 表格用于分析和绘图,而电子表格用于制作更易于阅读的数字摘要。 在临床试验领域,数据通常以图像中显示的方式存储,但显示方式可能更像您所显示的那样。
那么这就引出了下一个问题,您以您给我们的方式显示连接数据的目标是什么? 是出于报告目的还是您计划对结果进行一些额外的绘图或分析?
该任务可以通过向两个表添加一个计数器列来完成,计算每个患者的重复值的数量
然后就可以完成连接,匹配患者和柜台
最后,将数据排序回患者排序值并进行一些清理,任务就实现了

这是获取结果的 JSL,但是 JSL 中的每个任务都可以轻松地以交互方式完成
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} );