我有一個資料集,看起來像這樣,雖然大得多
### ##Fake data for stack exdb <- data.frame(zone =)
c(1, 1, 1。 2,2。 2)。 站點= c("study"。 "收集", "收集"。 "study", "study",
"收集", "收集")。 x = c(/span>53. 307726, 53.310660, 53.307089, 53.313831, 53.319087, 53. 318792)。 y = c(/span>-6. 222291, -6. 217151, -6.215080, /span> -6. 214152, -6. 218723, -6.215815))
我需要在STUDY站點和COLLECT站點之間運行一個點分析,以查看以米為單位的距離。問題是,我有許多不同的區或組,它們都是獨立的(即從1區的一個點到2區的一個點的距離是不相關的)。
由于這個原因,我需要做兩件事,
點分析,也就是對點的分析。
點分析,即計算每個區的一個研究點與多個收集點之間的距離,單位為米,
然后寫一個FORD-1。
然后撰寫一個 FOREACH 或 LOOP 函式,為資料集中的每個組計算這個距離。
一個最佳的輸出將看起來像
一個最佳的輸出將看起來像
exdb <- data. frame(zone = c(1, 1。 1, 2, 2,2),
site = c("study"。 "收集", "收集"。 "研究", "收集"。 "collect"),
x = c(53. 307726, 53.310660, 53. 307089, 53.313831, 53. 319087, 53.318792), 53.
y = c(-6. 222291, -6.217151, -6. 215080, -6.214152, -6. 218723, -6.215815), , -6.
dist = c(0,/span> 10。 3, 30. 4, 0, 12. 5, 11.2))
每個區的研究地點總是0,因為它是與這個地點的距離,而每個收集地點的距離只計算到每個獨特區的研究地點。
非常感謝你。
Kil
uj5u.com熱心網友回復:
簡單的基礎R版本,不需要其他軟體包。
如上所述,從exdb開始。
首先添加一個名為dist的新列,其值為"study",因為計劃是在zone和site=="study"上自我合并:
> exdb$dist = "study"/span>
自我合并,只保留坐標列:
自我合并,只保留坐標列。
> MM = merge(exdb, exdb,)
由。 x=c("zone"。 "site"),
由。 y=c("zone"。 "dist"))[/span>。 c("x。 x","y.x","x. y","y.y")】
使用distGeo來覆寫dist列。保持它的整潔:
> exdb$dist =distGeo(MM[, 2。 1]/span>。 MM[,4: 3])
> exdb
區域站點 x y 距離
1 1 研究 53.30773 -6.222291 0.0000
2 1 收集53. 31066 -6.217151 473.2943[/span]。
3 1 收集53. 30709 -6.215080 485.8806
4 2研究 53.31383 -6.214152 0.0000
5 2 收集53. 31909 -6.218723 659.5238
6 2 收集53. 31879 -6.215815 563.1349
回傳與@wimpel相同的答案,但沒有額外的依賴性,而且代碼行數較少。
uj5u.com熱心網友回復:
也許是這樣的?
假設x和y是經度和緯度,我們可以使用haversine函式來得到米的距離,在透視表格后,兩點都在一行中,距離是從(米)計算出來的:
library(tidyverse)
library(pracma)
#>
#> Attaching package: 'pracma'
#> 以下物件被屏蔽在'package:purrr'中:
#>
#> cross
data <- data. frame(zone = c(1。 1, 1。 2, 2, 2)。 站點= c()
"研究", "收集"。
"收集", "收集"
), x = c()
53.307726, 53. 310660, 53.307089, 53.
53.313831, 53.319087, 53.318792
)。 y = c(-6。 222291, -6.217151, -6. 215080, -6.214152, -6. 218723, -6.215815))
資料 %>%
pivot_wider(names_from =site, values_from = c(x, y)) %> %
unnest(y_collect, y_study, x_collect, x_study) %> %
mutate()
dist = list( x_study, y_study, x_collect, y_collect) %> % pmap_dbl(~haversine(c(. .1, .2), c(. 3, ...4) * 1000 )
)
#> 警告。值不是唯一標識的;輸出將包含串列庫。
#> * 使用`values_fn = list`來抑制這個警告。
#> * 使用`values_fn = length`來識別重復出現的地方。
#> * 使用`values_fn = {summary_fun}`來總結重復的內容。
#> 警告。值不是唯一標識的;輸出將包含串列庫。
#> * 使用`values_fn = list`來抑制這個警告。
#> * 使用`values_fn = length`來識別重復出現的地方。
#> * 使用`values_fn = {summary_fun}`來總結重復的內容。
#> Warning: unnest() has a new interface. 詳見?unnest。
#> 嘗試`df %>% unnest(c(y_collect, y_study, x_collect, x_study))`,必要時使用`mutate()`。
#> # A tibble: 4 x 6
#> zone x_study x_collect y_study y_collect dist
#> <dbl> <dbl> <dbl> <dbl> <dbl>/span>
#> 1 1 53.3 53.3 -6.22 -6.22 472.
#> 2 1 53.3 53.3 -6.22 -6.22 484.
#> 3 2 53.3 53.3 -6.21 -6.22 659.
#> 4 2 53.3 53.3 -6.21 -6.22 563.
創建于2021-09-13,由reprex軟體包(v2.0.1)
uj5u.com熱心網友回復:
我還在學習空間方面的知識,但這能行嗎?
library(sf)
library(tidyverse)
exdb %>%
arrange(zone, desc(site) %> % #ensure study is first[/span
st_as_sf(coords = c("x", "y")。 crs = 4326) %> %
group_by(zone) %> %
mutate()
study_coord = geometry[1] ,
dist = st_distance(geometry,/span> study_coord, by_element = T),
)
uj5u.com熱心網友回復:
我相信這應該可以。但我無法在所需的輸出中重現你的距離。
library(data.table)
library(purrr) # Or tidyverse
library(geosphere)
# 使你的資料成為data.table。
setDT(mydata)
# 根據區域和站點拆分到一個串列中
L < - split(mydata, 通過= c("zone"。 "site")。 flatten = FALSE)
# Loop over list
L < - lapply(L, function(zone) {
#get reference point to take dustance from
點。 研究 < - c(zone$study$y, zone$study$x)
zone$study$dist <- 0
# 計算距離 <- 0
zone$collect$dist <- unlist(purrr:: pmap( list(a =) 運算子">=zone$collect$Y。
b = zone$collect$x ),
~(geosphere::distGeo(point. 研究, c(. .1, . 2)))).
return(zone)
})。
# 將結果行系結在一起。
data.table::rbindlist(lapply(L, data. table::rbindlist))。
# zone site x y dist
# 1: 1 study 53.30773 -6.222291 0.0000
# 2: 1收集 53.31066 -6.217151 473.2943。
# 3: 1 收 53.30709 -6.215080 485.8806
# 4: 2 研究 53.31383 -6.214152 0.0000
# 5: 2 收集 53.31909 -6.218723 659.5238
# 6: 2 collect 53.31879 -6.215815 563.1349
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309984.html
標籤:
