您似乎正在寻找内部连接:
merge(dat1, dat2, by = c("Lat", "Long"))
# Lat Long Depth.x Nitrate Depth.y
# 1 165 -77 100 29.2275 100
# 2 165 -77 0 29.5420 100
# 3 165 -77 50 30.2213 100
# 4 25 -62 0 31.9784 0
# 5 25 -62 50 28.6408 0
# 6 25 -62 100 24.9746 0
# 7 76 -24 0 31.9784 50
# 8 76 -24 50 28.6408 50
# 9 76 -24 100 24.9746 50
这有一些风险:在比较列时,连接等依赖于严格相等,但浮点(具有许多位精度)对于大多数编程语言来说可能变得太“精细”而无法检测差异(参见 @987654321 @、Is floating point math broken? 和 https://en.wikipedia.org/wiki/IEEE_754)。这个问题的问题是你不会得到任何错误,它只是不会产生匹配。
要解决那个问题,您需要考虑“公差”,即dat1 中的点与dat2 中的点之间的距离,以及所有点之间的距离是多少有效地“足够接近”以构成连接。这可以通过以下两种方式之一完成:(1)计算dat1 中所有点与dat2 中所有点之间的距离,并为dat1 中的每个点取最小值(并且在公差范围内);或 (2) 执行“模糊连接”(使用恰当命名的 fuzzyjoin 包)以查找范围内的点(实际上类似于 dat1$Lat between dat2$Lat +/- 0.01 和 Long 的类似点)。
数据
dat1 <- structure(list(Lat = c(165L, 165L, 165L, 124L, 124L, 124L, 76L, 76L, 76L, 25L, 25L, 25L), Long = c(-77L, -77L, -77L, -46L, -46L, -46L, -24L, -24L, -24L, -62L, -62L, -62L), Depth = c(0L, 50L, 100L, 0L, 50L, 100L, 0L, 50L, 100L, 0L, 50L, 100L), Nitrate = c(29.542, 30.2213, 29.2275, 27.8544, 28.6458, 24.9543, 31.9784, 28.6408, 24.9746, 31.9784, 28.6408, 24.9746)), class = "data.frame", row.names = c(NA, -12L))
dat2 <- structure(list(Lat = c(165L, 76L, 25L), Long = c(-77L, -24L, -62L), Depth = c(100L, 50L, 0L)), class = "data.frame", row.names = c(NA, -3L))