如何根据一个完全匹配的列和一个最接近的匹配来连接表?你好,
我想通过 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 插件并使用大量子集来管理生物反应器组。
我也有一个脚本(和工具)应该能够做到这一点,但是我还没有时间完全测试它,而且我确信它仍然存在一些小错误。 连接最近的行工具应该能够:
- 根据距离加入
- 向后、向前和最近的连接表(带有可选的决胜选项)
- 允许分组
- 允许使用公差
- 不应该要求对数据表进行排序
