簡體   English   中英

如何將兩列(緯度/經度)中的數據與其他兩列中的最接近值進行匹配?

[英]How to match data in two columns (lat/long) to closest values in two other columns?

我有一個已知的經/緯度坐標列表,我需要在經/緯度網格內定位這些坐標,並提取相鄰數據。 我已知的經/緯度坐標位於以下數據框中:

LatLong <- structure(list(Lat_orig = c(-55.417, -55.417, -55.417, -55.417, 
-55.417), Long_orig = c(-69.58, -69.249, -69.0831, -69.417, -69.749
), Lat_new = c(NA, NA, NA, NA, NA), Long_new = c(NA, NA, NA, 
NA, NA), Jan = c(NA, NA, NA, NA, NA), Feb = c(NA, NA, NA, NA, 
NA), Mar = c(NA, NA, NA, NA, NA), Apr = c(NA, NA, NA, NA, NA), 
May = c(NA, NA, NA, NA, NA), Jun = c(NA, NA, NA, NA, NA), 
Jul = c(NA, NA, NA, NA, NA), Aug = c(NA, NA, NA, NA, NA), 
Sep = c(NA, NA, NA, NA, NA), Oct = c(NA, NA, NA, NA, NA), 
Nov = c(NA, NA, NA, NA, NA), Dec = c(NA, NA, NA, NA, NA)), .Names = c("Lat_orig", 
"Long_orig", "Lat_grid", "Long_grid", "Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = "data.frame", row.names = c(NA, 
-5L))



    Lat_orig    Long_orig   Lat_grid    Long_grid   Jan Feb Mar Apr May  Jun    Jul Aug Sep Oct Nov Dec
-55.417 -69.5800    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
-55.417 -69.2490    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
-55.417 -69.0831    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
-55.417 -69.4170    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
-55.417 -69.7490    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

我有第二個數據框,其中包含網格化的全局數據集。 它很大,但這是一小塊:

Grid <- structure(list(lat = c(-55.417, -55.417, -55.417, -55.417, -55.417
), long = c(-69.75, -69.583, -69.417, -69.25, -69.083), jan = c(8.5, 
8.5, 8.4, 8.7, 8.8), feb = c(8.4, 8.5, 8.3, 8.6, 8.8), mar = c(7.3, 
7.3, 7.2, 7.5, 7.6), apr = c(5.8, 5.8, 5.7, 5.9, 6), may = c(4, 
3.9, 3.7, 4, 4), jun = c(2.7, 2.7, 2.4, 2.7, 2.7), jul = c(2.2, 
2.2, 2, 2.2, 2.3), aug = c(2.6, 2.6, 2.4, 2.7, 2.8), sep = c(3.8, 
3.9, 3.7, 4, 4.1), oct = c(5.5, 5.5, 5.3, 5.7, 5.8), nov = c(6.6, 
6.7, 6.5, 6.9, 7), dec = c(7.9, 7.9, 7.7, 8.1, 8.2)), .Names = c("lat", 
"long", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", 
"sep", "oct", "nov", "dec"), class = "data.frame", row.names = c(NA, 
-5L))



    lat long    jan feb mar apr may jun jul aug sep oct nov dec
-55.417 -69.750 8.5 8.4 7.3 5.8 4.0 2.7 2.2 2.6 3.8 5.5 6.6 7.9
-55.417 -69.583 8.5 8.5 7.3 5.8 3.9 2.7 2.2 2.6 3.9 5.5 6.7 7.9
-55.417 -69.417 8.4 8.3 7.2 5.7 3.7 2.4 2.0 2.4 3.7 5.3 6.5 7.7
-55.417 -69.250 8.7 8.6 7.5 5.9 4.0 2.7 2.2 2.7 4.0 5.7 6.9 8.1
-55.417 -69.083 8.8 8.8 7.6 6.0 4.0 2.7 2.3 2.8 4.1 5.8 7.0 8.2

我需要找到每個緯度/經度坐標LatLongGrid ,然后從拉相鄰的數據Gridjandec並把這些成在數據幀的相應列LatLong 手動執行此操作時,我首先找到最接近的緯度,然后查看相關的經度以找到最接近的匹配項。 這將給我這樣的解決方案:

Lat_orig    Long_orig   Lat_grid    Long_grid   Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
-55.417 -69.58  -55.417 -69.583 8.5 8.5 7.3 5.8 3.9 2.7 2.2 2.6 3.9 5.5 6.7 7.9
-55.417 -69.249 -55.417 -69.25  8.7 8.6 7.5 5.9 4   2.7 2.2 2.7 4   5.7 6.9 8.1
-55.417 -69.0831    -55.417 -69.083 8.8 8.8 7.6 6   4   2.7 2.3 2.8 4.1 5.8 7   8.2
-55.417 -69.417 -55.417 -69.417 8.4 8.3 7.2 5.7 3.7 2.4 2   2.4 3.7 5.3 6.5 7.7
-55.417 -69.749 -55.417 -69.75  8.5 8.4 7.3 5.8 4   2.7 2.2 2.6 3.8 5.5 6.6 7.9

請注意,在我的示例中,所有的“緯度”值都是恆定的,但是在兩個數據幀中它們也有所不同。

有誰知道最好的方法嗎? 我已經嘗試使用gdist從包裝Imap ,我可以找到最近的點,但僅適用於單個在時間坐標! 有誰知道找到這些點並將數據移動到新數據框的好方法?

廣義問題,一維:

給定一組采樣點和一組參考點,如何將一個點映射到其最接近的參考點?

讓我們生成一些點和參考點。

set.seed(100)
pp <- sample(0:100, 10, replace = FALSE)
# [1] 31 25 54  5 45 46 77 34 50 15
rr <- sort(sample(0:100, 10, replace = FALSE))
# [1]  19  27  33  39  63  64  73  88  93 100

使用findInterval和中點:

## finds midpoints between reference points
midpoints <- head(rr,-1) + diff(rr)/2
# [1] 23.0 30.0 36.0 51.0 63.5 68.5 80.5 90.5 96.5
## determines which reference interval each sample point falls into
intv <- findInterval(pp, midpoints)
# [1] 2 1 4 0 3 3 6 2 3 0
## index back into reference point to find closest reference point
rr[intv+1]
# [1] 33 27 63 19 39 39 73 33 39 19

對您的緯度和經度都執行此操作,就可以找到合適的點。

要提取剩余的記錄數據,請使用merge但要注意浮點錯誤)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM