如何根據一個完全匹配的列和一個最接近的匹配來連接表?你好,
我想通過 JMP 中的“連接”功能連接兩個數據表。 我想根據時間和反應堆數量加入他們。 然而,這不起作用,因為其中一個數據文件中的“時間”列有 8 位小數,而另一個數據文件中有 0 位小數。
(如何)是否可以將最接近的匹配點的時間與反應堆編號精確匹配?
我已經找到了一些關於這個問題的較早的討論。 然而,這些解決方案對我來說不起作用,因為第二列“反應器編號”無法匹配。

這是我想要合併的兩個數據表的屏幕截圖。 輸出應包含時間、反應器、反射率和乾重。
提前致謝!
數據混合和清理回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?您提供的示例數據集是否匹配了錯誤的值?
創建柱乾重 g/l 並將反射率數據中的時間 h 重命名為時間 h:

將乾重數據連接到:

選擇反應器和時間 h 列並按它們排序。
選擇乾重缺失值 -> 選擇匹配單元格 -> 反向選擇
現在您可以在表格中跳轉以查找最接近的值:

此時,您可以創建一些幫助公式或腳本來計算最接近的值,例如這樣的內容以進一步減少數據:
Names Default To Here(1);
dt = Current Data Table();
r = dt << Get Selected Rows; //selecting of wanted rows could be done in script instead of datatable
r_min = r - 1;
r_max = r + 1;
dt << Subset(rows(Sort List(r||r_min||r_max)), Selected Columns(0));

此時,您很可能將乾重時間值複製粘貼到新列並創建公式來計算最接近的行。

這是使用 Join 時連接最近的行將返回的結果:

使用 Update,它不會創建那麼多雜亂的列:

該工具的用戶界面似乎在表選擇上存在一些問題...用戶必須確保選擇正確的表,否則該工具將進行自連接。
回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?感謝您的回复! 我會上傳一個小例子是的。
我曾經嘗試過手動執行此操作,但由於有多達 24 個組/反應器,所以花費的時間很長,而且您需要滾動瀏覽很多時間點。 創建子集? 您認為這如何運作?
回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?為什麼不直接創建一個新列,對 8 位數字的時間進行四捨五入 (round()s) 並加入其中呢?
**編輯**沒關係。我立刻明白為什麼。
通過執行以下操作,您可以僅獲取最接近時間的子集
Names default to here(1);
dt = New Table( "Example",
New Column( "Time",
Set Values( [14.14, 14.28, 13.56, 13.11, 12.32, .] )
)
);
dt << New Column("Rounded Time",
Formula(Round(:Time, 0))
);
// we're just going to for the row that the value for time - rounded time = the min for that value
dt << New Column("Closest",
Formula(
Abs(:Time - :RoundedTime) == ColMin(Abs(:Time - :RoundedTime), :RoundedTime)
)
);
回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?您能否提供在兩個數據表上都有多個反應器的小型示例數據集(在最好的情況下還有具有正確結果的表)? 如果沒有太多組並且不需要自動化,這可能可以手動完成。 您也許可以使用 fuzzy_merge 插件並使用大量子集來管理生物反應器組。
我也有一個腳本(和工具)應該能夠做到這一點,但是我還沒有時間完全測試它,而且我確信它仍然存在一些小錯誤。 連接最近的行工具應該能夠:
- 根據距離加入
- 向後、向前和最近的連接表(帶有可選的決勝選項)
- 允許分組
- 允許使用公差
- 不應該要求對數據表進行排序
