Несколько совпадений ближайшего соединения с данными.таблица

#r #join #data.table

#r #Присоединиться #данные.таблица

Вопрос:

У меня есть два 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 where 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
 

Любая помощь приветствуется.

Создано 2021-02-06 пакетом reprex (версия v1.0.0)

Ответ №1:

Теоретически вы должны быть в состоянии использовать mult = "all" . Однако в этой теме есть две открытые проблемы, которые предполагают, что в настоящее время это работает не так, как ожидалось. В с плавающими числами roll=»ближайший», mult =»все» ошибочно выдает только одно совпадение было предложено обходное решение, при котором столбец соединения был преобразован в целое число, которое затем вернуло правильное количество строк.

В последующей проблеме, при использовании более поздней data.table версии (объединение целых чисел, roll = «ближайший» и mult = «все» ошибочно выдает только одно совпадение), обходной путь больше не работал.

Комментарии:

1. Проблема открыта уже почти 1 год. Я надеюсь, что это будет исправлено. Спасибо за ваши ответы.