R语言 基于两个不同列之间最接近的较低值合并两个数据集的数据

jjhzyzn0  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(204)

我试图在两个数据集上进行完全连接,其中合并的列的值不同,我试图基于最接近的较低值合并数据。示例数据集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
5w9g7ksd

5w9g7ksd1#

我们可以使用join_by()

dplyr >= 1.1.0

我们现在可以

滚动连接

滚动联接是不等联接的一种变体,它限制从不等联接条件返回的结果。当没有精确匹配时,它们对于向前/向后“滚动”最接近的匹配很有用。若要构造滚动联接,请使用closest() Package 不等式。
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
))

相关问题