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

這是我想合併的兩個數據表的屏幕截圖。 輸出應包含時間、反應器、反射率和乾重。
提前致謝!
數據表回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?您能否提供在兩個數據表上都有多個反應器的小型示例數據集(最好的情況下還有正確結果的表)? 如果沒有太多組並且不需要自動化,這可能可以手動完成。 您也許可以使用fuzzy_merge 插件並使用大量子集來管理生物反應器組。
我也有一個腳本(和工具)應該能夠做到這一點,但是我還沒有時間完全測試它,我確信它仍然有一些小錯誤。 加入最近的行工具應該能夠:
- 根據距離加入
- 向後、向前和最近連接表(帶有可選的決勝局選項)
- 允許分組
- 允許使用公差
- 不應該要求有排序的數據表

回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?為什麼不直接創建一個新列,為具有 8 位數字的時間進行舍入()並加入該列?
**編輯**沒關係。我立即明白為什麼。
您可以通過執行以下操作僅獲得最近時間的子集
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)
)
);
回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?感謝您的回复! 我會上傳一個小例子是的。
我曾經嘗試過手動操作,但只要有多達 24 個組/反應器就需要很長時間,而且您需要滾動很多時間點。 創建子集? 你怎麼看它的工作原理?
回复:如何根據一個完全匹配的列和一個最接近的匹配來連接表?您提供的示例數據集是否匹配了錯誤的值?
在反射率數據中創建列乾重 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 它不會創建盡可能多的雜亂列:

工具的 UI 似乎在表選擇方面存在一些問題......並且用戶必須確保正確的表或選擇了正確的表,否則該工具將進行自聯接。