如何基于一个完全匹配的列和一个最接近的匹配来连接表?你好,
我想通过 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 似乎在表选择方面存在一些问题......并且用户必须确保正确的表或选择了正确的表,否则该工具将进行自联接。