我有鸟类的跟踪数据,并且设置了缓冲区。我想做的是找到动物每次旅行的缓冲区内的第一个点和缓冲区外的第一个点之间的持续时间,作为动物在那里度过的时间的代理。
我已确定每个 GPS 点是否在缓冲区内。我制作了一个新的数据框,其中包含缓冲区内至少有一个 GPS 点的所有行程 (trips_with_buffer_2016_df)。然后我取了缓冲区内每次行程的第一个点。
first_point_in_buffer <- trips_with_buffer_2016_df %>%
group_by(tripID) %>%
filter(buffer == "yes") %>%
slice_min(order_by = DateTime, n = 1)
然后在数据框中创建一个新列,其中包含缓冲区内每次行程第一个点的日期时间,并对同一行程的所有 GPS 点重复此值。
trips_with_buffer_2016_df <- left_join(trips_with_buffer_2016_df,
first_point_in_buffer %>% select(DateTime, tripID),
by = "tripID")
我遇到的困难是在缓冲区内的点之后找到缓冲区外的第一个点。我得到的最接近的是这个:
points_outside_buffer_after <- trips_with_buffer_2016_df %>%
group_by(tripID) %>%
filter(buffer == "no" & .$DateTime.x > .$DateTime.y) %>%
slice_min(order_by = .$DateTime.x, n = 1)
其中 DateTime.x 是该行中 GPS 的日期时间,而 DateTime.y 是该行缓冲区中第一个 GPS 点的日期时间。
不幸的是,我收到此错误:
Error in `stopifnot()`:
ℹ In argument: `buffer == "no" & .$DateTime.x > .$DateTime.y`.
ℹ In group 1: `tripID = "URI03_104"`.
Caused by error:
! `..1` must be of size 13 or 1, not size 4483.
除此之外,我注意到有些鸟类可能会在同一次旅行中返回缓冲区。例如,一只鸟可能会进入和退出,一段时间后它会在同一次旅行中再次进入,但我的代码没有捕获第二个入口,所以我意识到我需要进一步更改它。
您知道如何找到每个入口在缓冲区内花费的时间吗?我假设“对于“缓冲区”列中的每个“是”,找到同一行程的第一个“否”并计算差异。
非常感谢,并对这么长的帖子表示歉意。我对空间数据非常陌生。
这是使用上面评论的 sf 的示例工作流程。
library(sf)
library(tidyverse)
POINTS <- st_read("your_spatial_data.shp")
#or
POINTS <- st_as_sf("your_xy_dat.csv", coords=c("long_field", "lat_field"))
LINES <- POINTS %>%
group_by(animal_id) %>%
arrange(DATE_TIME) %>%
summarise() %>%
st_cast("LINESTRING")
ZONE <- st_read("your_zones_spatial.shp")
LINE_ZONES <- st_intersection(LINES, ZONE) %>%
group_by(ZONE_NAME, animal_id) %>%
summarise(do_union=T) %>%
st_cast("LINESTRING") %>%
mutate(ID=paste(ZONE_NAME, animal_id, row_number()))
POINTS_ZONE_ID <- POINTS %>%
st_join(LINE_ZONES)
POINTS_TIMES <- POINTS_ZONE_ID %>%
st_drop_geometry() %>%
group_by(ID) %>%
summarise(MIN_TIME=min(DATE_TIME), MAX_TIME=max(DATE_TIME)) %>%
mutate(DIFF_TIME=MAX_TIME-MIN_TIME )