表1看起来像
| 患者 | 分析结果1 | 测定结果2 | 测定结果3 |
| 1001 | 1个 | 一种 | + |
| 1001 | 2 | b | + |
| 1002 | 1个 | C | -- |
| 1003 | 2 | d | -- |
表2看起来像
| 患者 | 不良事件 |
| 1001 | aa |
| 1002 | 阿卜 |
| 1002 | AAC |
| 1002 | 阿德 |
| 1003 | bbb |
| 1003 | 英国广播公司 |
我想要得到的结果看起来像:(患者列是这两个表的“共享列”)
| 患者 | 分析结果1 | 测定结果2 | 测定结果3 | 不良事件 |
| 1001 | 1个 | 一种 | + | aa |
| 1001 | 2 | b | + | |
| 1002 | 1个 | C | -- | 阿卜 |
| | | | | AAC |
| | | | | 阿德 |
| 1003 | 2 | d | -- | bbb |
| | | | | 英国广播公司 |
有人可以给我一个解决方案(尽可能简单)吗?
谢谢
可以通过在两个表中添加一个计数器列来完成该任务,对存在的患者重复值的数量进行计数
然后可以完成连接,在患者和柜台上进行匹配
最后,将数据分类回到患者分类值并进行一些清理,就可以完成任务

这是获得结果的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} );
你好@VBIR ,
如@txnelson提到,要使表格看起来与显示的外观完全一样,您必须执行一些脚本编写或多个交互步骤。 但是,JMP表实际上并非旨在以这种方式显示数据。 它们是数据表,而不是电子表格,因此从JMP数据表的角度来看,简单的连接看起来像这样

这是因为JMP表用于分析和制图目的,而电子表格用于生成易于阅读的数字摘要。 在临床试验世界中,数据通常以图像中显示的方式存储,但显示的方式可能更像您显示的内容。
这就引出了下一个问题,以您给我们的方式显示联接数据的目标是什么? 是出于报告目的,还是您打算对结果进行一些其他图形化或分析?
哦,我忘了提一下,当多次测量患者的化验时,每个测量实际上都应该有自己的ID,以确保不良事件(具有匹配的ID)与每个测量正确对齐,而不会造成混淆(就像在我的示例中,患者1001重复发生了不良事件aaa,但我认为这种情况不应该发生。
通常情况下,不良事件的日期时间戳(或研究日)和每种测定的每次测量的日期时间戳(或研究日)。 这样,如果不良事件仅应针对每种测定的报告测量值之一,则将正确显示该事件。 在记录测定结果的同一天,对多种不良事件也是如此。 例如:
表格1
| 患者 |
学习日 |
测定1 |
测定2 |
测定3 |
| 1001 |
1个 |
1个 |
一种 |
+ |
| 1001 |
2 |
2 |
b |
+ |
表2
| 患者 |
学习日 |
不良事件 |
| 1001 |
1个 |
aa |
| 1001 |
2 |
|
表3(与患者和研究日的简单连接作为匹配列,并使用两个表中包含的不匹配项)
| 患者 |
学习日 |
测定1 |
测定2 |
测定3 |
不良事件 |
| 1001 |
1个 |
1个 |
一种 |
+ |
aa |
| 1001 |
2 |
2 |
b |
+ |
|
这样可以避免可能产生的含糊不清的意外分配,并允许在JMP中用于进一步的分析和制图。 另外,加入时实际上并不需要表2中的第2行,因为可以假设在研究第2天没有任何事件。
@chris_kirchberg感谢您的耐心配合和非常详细的解答!
我应该注意到,这是我凭空做出的一个例子。
我只想为其他编程团队创建一个类似于此示例的表格,以便他们可以轻松滚动屏幕来比较LB和AE。