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

如何基于if_else语句创建汇总前X行的新变量,计算移动10米耗时与平均转向角

解决方法

首先加载你熟悉的tidyverse工具集:

library(tidyverse)

我们先写一个自定义的10米指标计算函数,输入当前行索引、数据的距离列、耗时列、转向角列即可返回你需要的三个汇总值:

calc_10m_metrics <- function(current_idx, dist_col, dt_col, angle_col, target_dist = 10) {
  # 从当前行往前倒序取移动距离
  reverse_dist <- rev(dist_col[1:current_idx])
  # 计算倒序累计距离
  cum_rev_dist <- cumsum(reverse_dist)
  # 找到第一个累计距离达到/超过10米的位置
  cut_pos <- which(cum_rev_dist >= target_dist)[1]
  
  # 开头行累计距离不足10米时返回NA,你可以根据需求修改逻辑
  if (is.na(cut_pos)) {
    return(tibble(sum.dist = sum(reverse_dist), sum.dt = NA_real_, average.rel.angle = NA_real_))
  }
  
  # 确定参与计算的行范围
  selected_rows <- seq(current_idx - cut_pos + 1, current_idx)
  # 计算三个目标指标
  tibble(
    sum.dist = sum(dist_col[selected_rows]),
    sum.dt = sum(dt_col[selected_rows]),
    average.rel.angle = mean(angle_col[selected_rows], na.rm = T)
  )
}

接下来用你熟悉的dplyr语法就能直接给原数据加新列:

# 假设你的原GPS数据框名为gps_df
gps_df <- gps_df %>%
  rowwise() %>%
  mutate(metrics = list(calc_10m_metrics(cur_group_rows(), dist, dt, rel.angle))) %>%
  ungroup() %>%
  unnest(metrics)
补充说明
  • 转向角计算默认忽略了NA值,如果需要保留NA的影响,删除mean()函数里的na.rm = T参数即可
  • 如果数据量超过10万行,逐行计算的速度会稍慢,可以提前把三列数据转为向量传入函数优化速度,或者用Rcpp改写核心逻辑进一步提效
  • 停留不动导致dist为0的情况函数可以正常处理,会自动包含在累计计算范围内

内容的提问来源于stack exchange,提问作者Lily

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:15:03