首页 > 解决方案 > 与 data.table 的多个匹配最近的滚动连接

问题描述

我有两个data.table要基于两列合并。一个是完全匹配 ( station),另一个是最接近的值 ( depth_m)。

library(data.table)

df1 <- data.table(
  station = "a",
  depth_m = 1
)

df2 <- data.table(
  station = c("a", "a", "b"),
  depth_m = c(1.1, 1.1, 2),
  wavelength = c(300, 350, 300),
  bbp = c(0.0012, 0.0013, 0.0014)
)

df1
#>    station depth_m
#> 1:       a       1
df2
#>    station depth_m wavelength    bbp
#> 1:       a     1.1        300 0.0012
#> 2:       a     1.1        350 0.0013
#> 3:       b     2.0        300 0.0014

为此,我使用roll = "nearest"如下:

df2[df1, on = .(station, depth_m), roll = "nearest"]
#>    station depth_m wavelength    bbp
#> 1:       a       1        300 0.0012

但是,我也会得到df2where的行,wavelength == 350所以结果是:

data.table(
  station = c("a", "a"),
  depth = c(1, 1),
  wavelength = c(300, 305),
  bbp = c(0.0012, 0.0013)
)
#>    station depth wavelength    bbp
#> 1:       a     1        300 0.0012
#> 2:       a     1        305 0.0013

因此,我尝试使用mult = "all"没有成功:

df2[df1, on = .(station, depth_m), roll = "nearest", mult = "all"]
#>    station depth_m wavelength    bbp
#> 1:       a       1        300 0.0012

任何帮助表示赞赏。

reprex 包于 2021-02-06 创建(v1.0.0)

标签: rjoindata.table

解决方案


理论上你应该可以使用mult = "all". 但是,关于这个主题有两个未解决的问题,这表明目前这不能按预期工作。在使用浮点数时,roll="nearest", mult="all" 错误地只给出了一个匹配项,建议使用解决方法,将连接列转换为整数,然后返回正确的行数。

在后续问题中,使用更高data.table版本(Join on integers, roll = "nearest" and mult = "all" 错误地只给出一个匹配),解决方法不再有效。


推荐阅读