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

为每两组观测添加组ID:解决摄像头车辆时间差计算的数据缺失问题

解决方案:按车牌分组生成行程序列

问题的核心是你之前错误地按摄像头分组生成序列,导致不同车牌的记录被混在一起分组。正确的逻辑应该是按车牌分组,在每个车牌内部,根据摄像头的进出记录生成独立的行程序列,再处理数据缺失的情况。

步骤1:明确行程分组规则

对于每个车牌:

  • 每出现一次摄像头1(入口),开启一个新的行程组;连续的摄像头1可归为同一组(对应后续最近的摄像头2)
  • 摄像头2(出口)继承最近的摄像头1的组号
  • 如果车牌的第一条记录是摄像头2(无对应入口),单独作为一个行程组
  • 如果车牌的最后一条记录是摄像头1(无对应出口),保留其组号(后续可标记为缺失出口)

步骤2:代码实现

使用dplyr和tidyr工具实现正确分组:

library(dplyr)
library(tidyr)

# 完整示例数据
licence <- as.factor(c("A", "A", "A", "A", "B", "B", "C", "C", "C", "C", "C", "D", "D", "D"))
camera <- as.factor(c(1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2))
time <-   1:14

camera_data <- data.frame(licence, camera, time)

# 正确分组逻辑:每个摄像头1单独成组,摄像头2匹配最近的组号
camera_data_clean <- camera_data |>
  # 按车牌和时间排序,确保时序正确
  arrange(licence, time) |>
  # 按车牌分组处理
  group_by(licence) |>
  mutate(
    # 给每个摄像头1分配递增组号,摄像头2暂时留空
    sequence = ifelse(camera == "1", cumsum(camera == "1"), NA_integer_),
    # 向下填充组号,让后续的摄像头2继承最近的摄像头1的组号
    sequence = fill(sequence, .direction = "down")$sequence,
    # 处理开头是摄像头2的情况(无前置入口),单独分配组号
    sequence = ifelse(row_number() == 1 & camera == "2", 
                      max(sequence, na.rm = TRUE) + 1, 
                      sequence),
    # 处理无对应出口的摄像头1(最后一条是1的情况),保留组号
    sequence = ifelse(is.na(sequence), cumsum(is.na(sequence)), sequence)
  ) |>
  ungroup()

# 转换为宽格式,同一组内多个摄像头1时取最后一次记录的时间
camera_data_wide <- camera_data_clean |>
  pivot_wider(
    names_from = camera,
    values_from = time,
    values_fn = list(time = last)
  )

# 查看结果
print(camera_data_clean)
print(camera_data_wide)

步骤3:结果说明

  • 分组后的camera_data_clean中,每个车牌的行程序列独立:
    • C的两条摄像头1记录(time7、8)会分别生成组1和组2,摄像头2(time9)匹配组2;摄像头1(time10)生成组3,摄像头2(time11)匹配组3,完全符合你注释中的分组期望。
  • 转换为宽格式后,可直接计算时间差time_diff = 2-1``,缺失值会自动显示为NA,方便后续处理。

替代seq_len()的方法

  • cumsum()结合条件判断:这是最灵活的核心方法,可自定义分组触发条件
  • accumulate()(purrr包):逐个处理记录,自定义分组逻辑
  • consecutive_id()(dplyr 1.1.0+):结合分组内的摄像头变化生成组号:
    camera_data |>
      arrange(licence, time) |>
      group_by(licence) |>
      mutate(
        sequence = consecutive_id(ifelse(camera == "1", camera, lag(camera)))
      ) |>
      ungroup()
    

内容的提问来源于stack exchange,提问作者Raoul Van Oosten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:57:03