我正在尝试对两个数据集进行完全连接,其中按列合并的值不同,我正在尝试根据最接近的较低值合并数据。示例数据集 1
示例数据集 2
我想要的样子
我尝试过使用 fuzzy_full_join
fuzzy_full_join(gps.pts, dive.sum, by = c('num' = 'num.1'), match_fun = '>')
但是得到以下错误
Error in which(m) : argument to 'which' is not logical
我们可以使用
join_by()
dplyr >= 1.1.0
我们现在可以做
滚动连接
滚动连接是不等式连接的一种变体,它限制从不等式连接条件返回的结果。当没有精确匹配时,它们对于向前/向后“滚动”最接近的匹配很有用。要构建滚动连接,请用
closest()
. 包装不等式
closest(expr)
expr 必须是涉及以下之一的不等式:
>, >=, <, or <=
例如,
closest(x >= y)
解释为:对于 x 中的每个值,找到 y 中小于或等于该 x 值的最接近值。
closest()
将始终使用左侧表 (x) 作为主表,使用右侧表 (y) 作为查找最接近匹配项的表,无论不等式如何指定。例如, closest(y$a >= x$b) 将始终被解释为 closest(x$b <= y$a).
见 ?join_by()
library(dplyr) #>= 1.1.0
left_join(df1, df2, join_by(closest(num >= num)))
num.x Lat Long num.y dives underwate
1 2 30.89878 -88.78650 1 5 6.77
2 6 30.89760 -88.97650 4 9 5.99
3 8 30.89786 -88.67450 7 1 12.44
4 12 40.88764 -88.76450 9 22 23.20
5 15 30.98786 -88.87645 14 16 1.50
6 18 30.87650 -88.53726 16 11 2.40
7 22 30.62534 -88.66543 20 19 22.40
8 25 30.64536 -88.43434 24 7 18.60
9 29 30.98764 -88.76285 27 9 11.20
10 32 30.87465 -88.23488 31 23 197.70
data.table
library(data.table)
# Convert your dataframes to data.tables
dt1 <- as.data.table(df1)
dt2 <- as.data.table(df2)
# Set keys for rolling join
setkey(dt1, num)
setkey(dt2, num)
# Perform the rolling join
result <- dt2[dt1, roll = Inf]
# combine
cbind(dt2[,1, with = FALSE], result)
df1 <- structure(list(num = c(2L, 6L, 8L, 12L, 15L, 18L, 22L, 25L, 29L,
32L), Lat = c(30.89878, 30.8976, 30.897865, 40.88764, 30.98786,
30.8765, 30.62534, 30.64536, 30.98764, 30.87465), Long = c(-88.7865,
-88.9765, -88.6745, -88.7645, -88.87645, -88.53726, -88.665433,
-88.434337, -88.76285, -88.23488)), class = "data.frame", row.names = c(NA,
-10L))
df2 <- structure(list(num = c(1L, 4L, 7L, 9L, 14L, 16L, 20L, 24L, 27L,
31L), dives = c(5L, 9L, 1L, 22L, 16L, 11L, 19L, 7L, 9L, 23L),
underwate = c(6.77, 5.99, 12.44, 23.2, 1.5, 2.4, 22.4, 18.6,
11.2, 197.7)), class = "data.frame", row.names = c(NA, -10L
))