表 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} );