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

R语言按分组基于多列多行条件计算指标并创建数据框新列

实现方案

核心逻辑

  • 按Target字段拆分数据,每个目标的轨迹独立计算
  • 取每个分组首行的x、y坐标作为轨迹起始基准点
  • 逐行判断当前坐标与基准点的x/y绝对偏移量是否有任意一个≥0.2
  • 提取每个分组中第一个满足偏移阈值的行对应的时间值,整理为目标结构的新数据框

代码实现

方法1:dplyr实现(可读性强,适配任意规模数据集)

library(dplyr)

res <- dat %>%
  group_by(Target) %>%
  mutate(
    # 记录每组起始坐标
    init_x = first(targ1frames_x),
    init_y = first(targ1frames_y),
    # 判断是否达到偏移阈值
    is_hit = abs(targ1frames_x - init_x) >= 0.2 | abs(targ1frames_y - init_y) >= 0.2
  ) %>%
  # 取每组第一个达标记录
  filter(is_hit) %>%
  slice_head(n = 1) %>%
  # 重命名列、输出目标结构
  select(Target, targ1_initTime = targ1frames_time) %>%
  ungroup()

运行上述代码在示例数据上得到的结果和预期完全一致:

# A tibble: 4 × 2
  Target targ1_initTime
  <chr>           <dbl>
1 1                0.43
2 2                0.18
3 3                0.18
4 4                0.18

方法2:基础R实现(无需安装额外依赖包)

res <- do.call(
  rbind,
  lapply(split(dat, dat$Target), function(sub_df) {
    # 提取起始坐标
    sx <- sub_df$targ1frames_x[1]
    sy <- sub_df$targ1frames_y[1]
    # 定位第一个达标的行位置
    hit_pos <- which(abs(sub_df$targ1frames_x - sx) >= 0.2 | abs(sub_df$targ1frames_y - sy) >= 0.2)[1]
    # 返回结构化结果
    data.frame(
      Target = sub_df$Target[1],
      targ1_initTime = sub_df$targ1frames_time[hit_pos]
    )
  })
)

边界情况说明

如果实际数据中存在某组全程没有坐标偏移达到0.2阈值的情况,上述代码会自动返回NA作为对应的时间值,你可以根据业务需要调整这类场景的处理规则,比如将这类记录标记为无有效偏移、或取分组最后一个时间点作为替代值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:15:51