R语言amt包steps_by_burst()丢失重要变量的解决方法咨询
解决amt包中
steps_by_burst()丢失非空间变量的问题 问题背景
处理佩戴项圈的自由放牧绵羊GPS数据时,需生成用于步长选择函数的步长文件,且必须保留breed、collar_id等非空间变量。数据转换为track并重采样时变量可保留,但运行steps_by_burst()后变量丢失,且因无单独唯一标识符,无法直接通过单独存储再合并的方式解决。
可复现示例代码
library(amt) df <- data.frame( .x = c(631309, 631312, 631350, 631320, 631305, 635309, 635312, 635350, 635320, 635305), .y = c(6757837, 6757800, 6757900, 6757820, 6757830, 6757337, 6757300, 6757300, 6757320, 6757330), t = as.POSIXct("2024-01-01") + (0:4) * 1200, breed = c(rep("gns", 5), rep("nks", 5)), collar_id = c(rep(101, 5), rep(102, 5)) ) trk <- make_track(df, .x, .y, t, breed, collar_id) trk_steps <- trk %>% track_resample(rate = minutes(20), tolerance = minutes(3)) %>% filter_min_n_burst(min_n = 3) %>% steps_by_burst()
运行后trk_steps会丢失breed和collar_id,期望结果包含这些变量。
解决方案
核心逻辑:同一burst_对应同一只绵羊的轨迹段,breed和collar_id在单个burst内是恒定的,因此可以通过burst_作为关联键,将变量重新附加到步长数据中。以下提供两种可行方法:
方法1:嵌套分组处理(推荐)
通过分组嵌套,对每个burst单独生成步长并保留变量:
library(amt) library(dplyr) library(purrr) # 示例数据(同前) df <- data.frame( .x = c(631309, 631312, 631350, 631320, 631305, 635309, 635312, 635350, 635320, 635305), .y = c(6757837, 6757800, 6757900, 6757820, 6757830, 6757337, 6757300, 6757300, 6757320, 6757330), t = as.POSIXct("2024-01-01") + (0:4) * 1200, breed = c(rep("gns", 5), rep("nks", 5)), collar_id = c(rep(101, 5), rep(102, 5)) ) trk <- make_track(df, .x, .y, t, breed, collar_id) # 处理流程 trk_steps <- trk %>% track_resample(rate = minutes(20), tolerance = minutes(3)) %>% filter_min_n_burst(min_n = 3) %>% # 按burst分组并嵌套数据 group_by(burst_) %>% nest() %>% # 生成步长并提取组内恒定的变量 mutate( steps = map(data, ~ steps_by_burst(.x)), breed = map_chr(data, ~ first(.x$breed)), collar_id = map_dbl(data, ~ first(.x$collar_id)) ) %>% # 展开步长数据并清理冗余列 unnest(steps) %>% select(-data) %>% # 调整列顺序(可选) select(burst_, x1_, x2_, y1_, y2_, sl_, direction_p, ta_, t1_, t2_, dt_, breed, collar_id) # 验证结果列名 names(trk_steps)
方法2:提取burst变量后关联
先保存重采样后的轨迹数据,提取每个burst对应的变量后合并:
library(amt) library(dplyr) # 示例数据(同前) df <- data.frame( .x = c(631309, 631312, 631350, 631320, 631305, 635309, 635312, 635350, 635320, 635305), .y = c(6757837, 6757800, 6757900, 6757820, 6757830, 6757337, 6757300, 6757300, 6757320, 6757330), t = as.POSIXct("2024-01-01") + (0:4) * 1200, breed = c(rep("gns", 5), rep("nks", 5)), collar_id = c(rep(101, 5), rep(102, 5)) ) trk <- make_track(df, .x, .y, t, breed, collar_id) # 保存重采样后的轨迹数据 trk_resampled <- trk %>% track_resample(rate = minutes(20), tolerance = minutes(3)) %>% filter_min_n_burst(min_n = 3) # 生成步长数据 trk_steps <- steps_by_burst(trk_resampled) # 提取每个burst对应的唯一变量值 burst_vars <- trk_resampled %>% as.data.frame() %>% select(burst_, breed, collar_id) %>% distinct() # 合并变量到步长数据 trk_steps <- trk_steps %>% left_join(burst_vars, by = "burst_") # 验证结果列名 names(trk_steps)
两种方法都能保留breed和collar_id变量,最终结果列名符合需求。
内容的提问来源于stack exchange,提问作者SarahLou
相关产品推荐
相关产品推荐

