如何为动物GPS轨迹随机采样点标注原始ID并生成二项式数据集
解决动物轨迹GPS位置生成带关联ID的随机点问题
问题需求
需要为每个动物GPS位置(总计约200个ID)的15公里半径范围内生成20个随机点,且每个随机点必须关联原始观测位置的id、time等信息,最终构建包含观测点(标记为1)和随机点(标记为0)的整洁数据集,用于二项式响应分析。
示例原始数据:
df <- data.frame(id = c("id1", "id1", "id1", "id2", "id2", "id2"), long = c(-80, -81, -82, -79, -70, -75), lat = c(36, 37, 38, 41, 40, 40.5), time = c(7, 8, 9, 6, 7, 8))
现有代码问题
当前使用st_buffer+st_sample能生成正确数量的随机点,但因为分组操作和采样时丢失属性,导致随机点无法关联回对应的原始观测位置(缺失id、time信息)。
解决方案
核心思路:在采样全过程保留原始观测的属性信息,确保每个缓冲区(对应单个GPS位置)的采样点能精准关联到该位置的id和time。
完整修正代码
library(sf) library(dplyr) # 1. 转换原始数据为空间对象并投影到米制坐标系 df_sf <- df %>% st_as_sf(coords = c("long", "lat"), crs = "epsg:4326") %>% st_transform(crs = "epsg:26915") # 用米制CRS,方便设置15km缓冲区 # 2. 为每个GPS位置生成带属性的15km缓冲区 buffers <- df_sf %>% st_buffer(dist = 15000) # 15公里=15000米,此时每行仍保留id、time # 3. 为每个缓冲区生成20个随机点,绑定原始属性 random_points <- buffers %>% st_sample(size = 20, by_feature = TRUE, exact = TRUE) %>% st_as_sf() %>% # 把缓冲区的id、time属性关联到采样点 bind_cols(buffers %>% st_drop_geometry()) %>% mutate(type = 0) %>% # 标记为随机点 st_set_geometry("geometry") # 4. 处理原始观测点,标记为type=1 observed_points <- df_sf %>% mutate(type = 1) # 5. 合并数据集并转回WGS84坐标系,提取经纬度 final_df <- bind_rows(observed_points, random_points) %>% st_transform(crs = "epsg:4326") %>% # 提取经纬度列 mutate(long = st_coordinates(.)[,1], lat = st_coordinates(.)[,2]) %>% # 移除空间几何列(如果不需要空间对象) st_drop_geometry() %>% # 整理列顺序 select(id, long, lat, time, type) # 查看结果示例 head(final_df, 10)
关键细节说明
by_feature=TRUE:强制每个缓冲区(对应单个原始GPS位置)独立采样20个点,避免不同位置的采样点混淆bind_cols(buffers %>% st_drop_geometry()):这是保留关联信息的核心步骤,把每个缓冲区对应的id、time直接绑定到采样点上- 最终合并后的数据集中,每个随机点都能精准对应到生成它的原始观测位置的
id和time
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

