[英]Calculate distance between coordinates in R
我想計算我的數據幀的經緯度位置之間的距離(以米為單位),但有以下限制: 1.- 只有相同 CLIENTID 的經緯度,但它們之間的所有數據都是相同的。 2.- 為每個 CLIENTID 生成一個新的數據框(並導出到 CSV o XLS)
我的數據存儲為:
| CLIENT ID | HOUSE ID | LAT | LONG |
| 111111111 | xxx111 | xx.xx| xx.xx|
| 111111111 | xxx112 | xx.xx| xx.xx|
| 111111111 | xxx145 | xx.xx| xx.xx|
| 222222222 | xxx345 | xx.xx| xx.xx|
| 222222222 | xxx 666 | xx.xx| xx.xx|
我需要的:
以 CLIENTID (CLIENTID.csv) 命名的 CSV 或 XLS 文件,內容如下:
| CLIENT ID | HOUSE ID1 | HOUSE ID 2| DISTANCE |
| 111111111 | xxx111 | xxx112 | 950 |
| 111111111 | xxx111 | xxx145 | 750 |
| 111111111 | xxx112 | xxx145 | 250 |
我嘗試了一些鏈接,但我不知道如何解決它,因為我已經與計算機斷開連接了一年 (COVID)
鏈接:
使用R中的distm()計算數據幀中兩個GPS位置之間的距離
編輯:添加數據
對不起,我的第一次寫作。 我完全被屏蔽了,我無法以適當的方式詢問。
我已經將兩個數據幀(leftjoin)組合起來以獲得帶有“Doc_titular”的 AAA_JOIN 數據幀
現在我的問題開始了:
1.- 從“Doc_titular”中過濾,並從同一個“Doc_titular”中獲取所有行
2.- 計算所有 LAT/LONG 之間的距離 3.- 將每個“Doc_titular”的數據存儲在 CSV 中,所有 HouseID 距離均采用上述格式(Doc_titular; HouseId; HouseId(n); Meters)
下面是一個數據示例:
Doc_titular House_ID longitude latitude
26DF5756F AAA/BA/00145 -3.36715925514947 3.80089929185657
26DF5756F AAA/BA/00146 -3.36687508416913 3.80092746460019
26DF5756F AAA/BA/00733 -3.37604382639631 3.80126114282085
45GH7765B AAA/BA/00123 -3.36887798896237 3.80405033823961
45GH7765B AAA/BA/00498 -3.37077717656959 3.80121749925945
45GH7765B AAA/BA/00998 -3.79037050320006 3.77633839304628
45GH7765B AAA/BA/00332 -3.38064351196704 3.80099089206718
98TR2794P AAA/BA/00420 -3.36824907065489 3.80086791973886
98TR2794P AAA/BA/00557 -3.37255900917349 3.80107792023686
98TR2794P AAA/BA/00556 -3.36674589155523 3.8012204114931
98TR2794P AAA/BA/00040 -4.05181620512371 3.80137173136896
對不起,如果我發布一些基本的東西,但我不太擅長 R,而且今年我對計算機很遠。 提前致謝。
這是我使用purrr
和geosphere::distm()
解決方案:
library(purrr)
split(your_data, ~ Doc_titular) %>%
map(~ pmap(.x, list)) %>%
map_dfr(~ combn(.x, 2, simplify = F) %>% map_dfr(~ do.call(\(h1, h2) {
c(House_ID_1 = h1$House_ID,
House_ID_2 = h2$House_ID,
Distance = geosphere::distm(c(h1$longitude, h1$latitude),
c(h2$longitude, h2$latitude)))
}, .x)))
返回:
# A tibble: 15 x 3
House_ID_1 House_ID_2 Distance
<chr> <chr> <chr>
1 AAA/BA/00145 AAA/BA/00146 31.7180146462883
2 AAA/BA/00145 AAA/BA/00733 987.675672076512
3 AAA/BA/00146 AAA/BA/00733 1019.09764067029
4 AAA/BA/00123 AAA/BA/00498 377.66269306226
5 AAA/BA/00123 AAA/BA/00998 46918.5688963262
6 AAA/BA/00123 AAA/BA/00332 1349.94747698525
7 AAA/BA/00498 AAA/BA/00998 46688.6347143115
8 AAA/BA/00498 AAA/BA/00332 1096.20190700286
9 AAA/BA/00998 AAA/BA/00332 45593.1545475677
10 AAA/BA/00420 AAA/BA/00557 479.294723110493
11 AAA/BA/00420 AAA/BA/00556 171.456842525277
12 AAA/BA/00420 AAA/BA/00040 75928.0863123282
13 AAA/BA/00557 AAA/BA/00556 645.89145220337
14 AAA/BA/00557 AAA/BA/00040 75449.3320106569
15 AAA/BA/00556 AAA/BA/00040 76095.0197361047
(使用的數據:)
your_data <- structure(list(Doc_titular = c("26DF5756F", "26DF5756F", "26DF5756F", "45GH7765B", "45GH7765B", "45GH7765B", "45GH7765B", "98TR2794P", "98TR2794P", "98TR2794P", "98TR2794P"), House_ID = c("AAA/BA/00145", "AAA/BA/00146", "AAA/BA/00733", "AAA/BA/00123", "AAA/BA/00498", "AAA/BA/00998", "AAA/BA/00332", "AAA/BA/00420", "AAA/BA/00557", "AAA/BA/00556", "AAA/BA/00040"), longitude = c(-3.36715925514947, -3.36687508416913, -3.37604382639631, -3.36887798896237, -3.37077717656959, -3.79037050320006, -3.38064351196704, -3.36824907065489, -3.37255900917349, -3.36674589155523, -4.05181620512371), latitude = c(3.80089929185657, 3.80092746460019, 3.80126114282085, 3.80405033823961, 3.80121749925945, 3.77633839304628, 3.80099089206718, 3.80086791973886, 3.80107792023686, 3.8012204114931, 3.80137173136896)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.