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
相关产品推荐
相关产品推荐

