#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 год. Я надеюсь, что это будет исправлено. Спасибо за ваши ответы.