你好,
我有一組患者的兩個資料集。一個有測試“a”的日期,另一個有測試“b”的日期。某主題的測試 a 和 b 的數量各不相同(即,有些測試 a 較多,b 較少,反之亦然)
我需要找到測試 a 和 b 在某個時間範圍內(該項目為 90 天)的所有實例。如何自動比較測試 a 和 b 的所有組合以找到此參數內的測試?換句話說,如何將每個測試 a 日期與所有測試 b 日期進行比較以計算日期差異(並隔離那些 <90d 的日期)?如果我只得到所有日期差異組合的列表,我可以輕鬆排序以找到那些 <90d
下面的例子
數據集1
主題# 測試 A 日期
1 1/1/23
1 2/1/23
1 3/1/23
1 4/1/23
2 2/1/10
2 5/1/10
數據集2
科目編號 測驗 B 日期
2014 年 1 月 1 日
1 6/1/23
1 11/1/22
2 1/1/10
2 1/1/23
2 1/5/23
結果
主題 測試 a 日期 測試 b 日期 日期差異
1 23年1月1日 22年11月1日 60天
1 23/1/3 23/6/1 90天
2 2010年2月1日 10年1月1日 30天
我會嘗試按主題連接資料集,然後使用 datedifference 函數來計算測試 A 和測試 B 之間的差異。我有點不清楚你是否想要所有測試對的所有差異,或者只是最小或最大差異。如果是最小值或最大值,您應該能夠在計算日期差異之前為測試 A 和 B 的最早和/或最晚日期建立新列。如果您想要所有差異,那麼您可能需要在計算日期差異之前重組資料集(可能透過在加入資料集後堆疊測試 A 和測試 B 列)。
附件是上述範例的 3 個資料集。我不確定您的結果表是什麼意思 - 匹配項比您顯示的要多。因此,如果它是我所附內容的縮寫,那麼這應該適合您。如果您真的只想在結果中顯示這 3 場比賽和差異,那麼我不明白您如何選擇您想要的比賽。
我相信
Tables=>Join 會做你想做的事。

下面的腳本建立 2 個範例表,然後將它們連接在一起並突出顯示日期差異大於 90 的所有行。
Names Default To Here( 1 );
dt1 = New Table( "Dataset1",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "1", "2", "2"} )
),
New Column( "Test A Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3755376000, 3758054400, 3760473600, 3763152000, 3347827200, 3355516800] )
)
);
dt2 = New Table( "Dataset2",
Add Rows( 6 ),
New Column( "Subject",
Character,
"Nominal",
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Values( {"1", "1", "1", "2", "2", "2"} )
),
New Column( "Test B Date",
Numeric,
"Nominal",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Property( "Value Order", {Numerical Order( 0 )} ),
Set Selected,
Set Values( [3471379200, 3768422400, 3750105600, 3345148800, 3755376000, 3755721600] )
),
Set Row States( [1, 0, 0, 0, 0, 0] )
);
// The code below is the code that does the work.
dtFinal = dt1 << Join(
With( dt2 ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :Subject = :Subject ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "Final" )
);
dtFinal << New Column( "Date Diff in Days", formula( Abs( :Test A Date - :Test B Date ) / In Days( 1 ) ) );
dtFinal << select where(:Date Diff in Days > 90 );
我得到了和你一樣的東西,除了兩項:我計算了幾個月而不是幾天的差異(一個疏忽 - 天更有意義),並且你使用了差異的絕對值。請求中並不清楚該因子 - 我通常認為測試是連續的(A 在 B 之前),但考慮到許多 B 測試在 A 測試之前,我想絕對值更有意義。
我的目標是隔離受試者,將其納入一項研究,這些受試者在 90 天內完成了測試 a 和 b。我的結果僅列出了其間 <=90d 的一對測試,因為這將是所需的結果。
所以我的解決方案或 txnelson 的解決方案都可以工作(他是編碼嚮導,我只使用滑鼠)。計算日期差異後,只需選擇 < 90 天的日期或建立一個列,用指示器(例如 1 與 0)來識別 < 90 天的日期。
我還編寫了一個可用於此目的的加載項(使用起來很笨重,並且自動化可能有點困難,但應該是可能的)。 連接最近的行 - 使用連續列和最近的值連接表。 我希望我有時間重寫這個
由於 JMP 日期時間以秒為單位,因此容差設定為 7776000。 連接方向是最近的,因為我們可以向後或向前連接

從結果中您可以刪除沒有匹配項的額外行

一些清理後

如果你了解 SQL,你可以使用它
Query(
Table(dt1, "dt1"),
Table(dt2, "dt2"),
"\[SELECT dt1.*, dt2."Test B Date", Abs(dt1."Test A Date" - dt2."Test B Date") / (24*60*60) DeltaDays
FROM dt1
join dt2 on dt1.subject = dt2.subject
where
Abs(dt1."Test A Date" - dt2."Test B Date") <= 90*24*60*60
]\"
);
但在這種情況下,我認為使用JMP 的交互式解決方案並採用JMP 為您創建的腳本(按主題加入,根據日期差異添加新列(右鍵單擊菜單可以執行此操作),添加第二列以檢查差異是否足夠小,據此執行選擇並刪除多餘的行)。 兩個都@tx尼爾森和@dale_lehman或多或少暗示了這一點
加入:

新增第一個公式列

新增第二個公式

選擇 0 行並刪除它們

最後結果

JMP 創建的腳本(應該稍微清理一下,關於這個的好帖子更好的 JSL 更平滑的遷移:如何修復您自己的程式碼)
