我有一個資料框,由一系列時間戳組成,這些時間戳帶有與動物 GPS 跟蹤資料相關的經緯度點位置,分為每只動物進行的單獨旅行。對于每個帶時間戳的經緯度,我還有該點到動物棲息地的距離(以公里為單位)。
我想根據每個點是否發生在動物到達其棲息地的最大距離之前或之后對每個點進行分類。
目的是在資料框中有一列,說明在動物旅行的向外部分(定義為動物到達其棲息地的最大距離之前的所有點)或回傳部分(在動物到達其家群落的最大距離之后和回傳群落之前發生的所有點)。
以下是 2 次旅行的示例資料:
我想要的輸出如下 - 下表,添加了“Loc_Class”(位置分類)列,其中 MAX = 與群體的最大距離,OUT = 在動物達到該 MAX 之前下降的點,RET = 點動物已經達到遠離群體的最大距離并正在回傳。
| 行程編號 | 時間戳 | 倫敦 | 土地增值稅 | 殖民地_lat | 菌落_lon | Dist_to_Colony | Loc_Class |
|---|---|---|---|---|---|---|---|
| 一個 | 18/01/2022 14:00 | -2.81698 | -69.831474 | -71.89 | 5.159 | 369.9948202 | 最大限度 |
| 一個 | 18/01/2022 14:30 | -2.750411 | -69.811873 | -71.89 | 5.159 | 369.5644383 | 休息時間 |
| 一個 | 18/01/2022 15:00 | -2.736943 | -69.811022 | -71.89 | 5.159 | 369.2463158 | 休息時間 |
| 一個 | 18/01/2022 15:30 | -2.645026 | -69.804136 | -71.89 | 5.159 | 367.1665826 | 休息時間 |
| 一個 | 18/01/2022 16:00 | -2.56825 | -69.833432 | -71.89 | 5.159 | 362.7877481 | 休息時間 |
| 乙 | 18/01/2022 21:30 | -3.046828 | -69.784849 | -71.89 | 5.159 | 380.0350746 | 出去 |
| 乙 | 18/01/2022 22:00 | -3.080154 | -69.765688 | -71.89 | 5.159 | 382.4142364 | 出去 |
| 乙 | 19/01/2022 00:30 | -3.025742 | -69.634483 | -71.89 | 5.159 | 390.8078861 | 最大限度 |
| 乙 | 19/01/2022 01:00 | -2.898522 | -69.672147 | -71.89 | 5.159 | 384.3511473 | 休息時間 |
| 乙 | 19/01/2022 01:30 | -2.907463 | -69.769916 | -71.89 | 5.159 | 377.173593 | 休息時間 |
library(tidyverse)
library(dplyr)
library(geosphere)
#load dataframe
df <- read.csv("Tracking_Data.csv")
#Great circle (geodesic) - add the great circle distance between the timestamped location and the animals' colony
df_2 <- df %>% mutate(dist_to_colony = distGeo(cbind(LON, LAT), cbind(Colony_lon, Colony_lat)))
#change distance from colony from m to km
df_2 <- df_2 %>% mutate(dist_to_colony = dist_to_colony/1000)
#find the point at which the maximum distance to colony occurs for each animals' trips
Max_dist_colony <- df_2 %>% group_by(TripID) %>% summarise(across(c(dist_to_colony), max))
#so now I need to classify each point using the 'Timestamp' and 'Dist_to_Colony' column and make a 'Loc_Class' column:
#example df
| Trip_ID | Timestamp | LON | LAT |Colony_lat|Colony_lon|Dist_to_Colony|
| -------- | -----------------|----------------------|--------- |--------- |------------- |
|A |18/01/2022 14:00 |-2.81698 |-69.831474 | -71.89 |5.159 |369.9948202 |
|A |18/01/2022 14:30 |-2.750411|-69.811873 | -71.89 |5.159 |369.5644383 |
|A |18/01/2022 15:00 |-2.736943|-69.811022 | -71.89 |5.159 |369.2463158 |
|A |18/01/2022 15:30 |-2.645026|-69.804136 | -71.89 |5.159 |367.1665826 |
|A |18/01/2022 16:00 |-2.56825 |-69.833432 | -71.89 |5.159 |362.7877481 |
|B |18/01/2022 21:30 |-3.046828|-69.784849 | -71.89 |5.159 |380.0350746 |
|B |18/01/2022 22:00 |-3.080154|-69.765688 | -71.89 |5.159 |382.4142364 |
|B |19/01/2022 00:30 |-3.025742|-69.634483 | -71.89 |5.159 |390.8078861 |
|B |19/01/2022 01:00 |-2.898522|-69.672147 | -71.89 |5.159 |384.3511473 |
|B |19/01/2022 01:30 |-2.907463|-69.769916 | -71.89 |5.159 |377.173593 |
uj5u.com熱心網友回復:
是這樣的嗎?
comp3 <- function(vec, val, out = -1:1) ifelse(abs(vec - val) < 1e-9, out[2], ifelse(vec < val, out[1], out[3]))
quux %>%
group_by(Trip_ID) %>%
mutate(Direction = comp3(row_number(), which.max(Dist_to_Colony), c("OUT", "MAX", "RET"))) %>%
ungroup()
# # A tibble: 10 x 9
# Trip_ID Timestamp LON LAT Colony_lat Colony_lon Dist_to_Colony Loc_Class Direction
# <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
# 1 A 18/01/2022 14:00 -2.82 -69.8 -71.9 5.16 370. MAX MAX
# 2 A 18/01/2022 14:30 -2.75 -69.8 -71.9 5.16 370. RET RET
# 3 A 18/01/2022 15:00 -2.74 -69.8 -71.9 5.16 369. RET RET
# 4 A 18/01/2022 15:30 -2.65 -69.8 -71.9 5.16 367. RET RET
# 5 A 18/01/2022 16:00 -2.57 -69.8 -71.9 5.16 363. RET RET
# 6 B 18/01/2022 21:30 -3.05 -69.8 -71.9 5.16 380. OUT OUT
# 7 B 18/01/2022 22:00 -3.08 -69.8 -71.9 5.16 382. OUT OUT
# 8 B 19/01/2022 00:30 -3.03 -69.6 -71.9 5.16 391. MAX MAX
# 9 B 19/01/2022 01:00 -2.90 -69.7 -71.9 5.16 384. RET RET
# 10 B 19/01/2022 01:30 -2.91 -69.8 -71.9 5.16 377. RET RET
該comp3函式實際上只是一個三元結果比較函式:不是 (vec > val)回傳0(false) 和1(true) 之類的函式,而是在它們相等時給出第三個結果。例如,
comp3(1:5, 4)
# [1] -1 -1 -1 0 1
對此的擴展是out=允許用戶指定這三個值應該是什么而不是 的引數-1:1。(如果您想縮短 dplyr 代碼,請隨意將 的默認值硬編碼out=為您的字串向量。
另一個注意事項:使用abs(vec - val) < 1e-9是推廣它的另一個步驟:如果給定浮點 ( numeric) 值,我們可能會遇到高精度數字的嚴格浮點相等性問題(參見,為什么這些數字不相等?,Is floating point math broken?,和https://en.wikipedia.org/wiki/IEEE_754)。在這種情況下,它有點矯枉過正,但它不會回傳不同的值。(而且由于您談論的是一個有 4000 個左右位置的表,執行此額外步驟的“開銷”可能不是人類顯而易見的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/536380.html
上一篇:Rmarkdown自動換行
