如何基于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
相关产品推荐
相关产品推荐

