【问题标题】:Multiple matches nearest roll join with data.table与 data.table 的多个匹配最近的滚动连接
【发布时间】:2021-05-10 14:12:00
【问题描述】:

我有两个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

但是,我也会得到df2 的行,其中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 package (v1.0.0) 于 2021 年 2 月 6 日创建

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    理论上你应该可以使用mult = "all"。但是,关于这个主题有两个未解决的问题,这表明目前这不能按预期工作。在with floats, roll="nearest", mult="all" erroneously gives only a single match 中提出了一种解决方法,将连接列转换为整数,然后返回正确的行数。

    在后续问题中,使用更高版本的data.table 版本(Join on integers, roll = "nearest" and mult = "all" erroneously gives only a single match),变通方法不再有效。

    【讨论】:

    • 这个问题已经打开了快一年了。我希望这得到修复。谢谢你的回答。
    猜你喜欢
    • 2018-06-24
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2021-05-11
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多