根据两个不同列之间的最低值合并来自两个数据集的数据

问题描述 投票:0回答:1

我正在尝试对两个数据集进行完全连接,其中按列合并的值不同,我正在尝试根据最接近的较低值合并数据。示例数据集 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
r merge dataset data-handling
1个回答
0
投票

我们可以使用

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
))
© www.soinside.com 2019 - 2024. All rights reserved.