You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:54:52