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

如何在R语言中追踪数据变化?包裹位置ID变更追踪问询

解决R语言包裹位置变更追踪问题

我来帮你搞定这个包裹位置追踪的问题!针对每日更新的包含date、package_id、location_id的DataFrame,我们可以用dplyr和tidyr轻松提取出位置变更的记录,过滤掉连续相同位置的重复行。

第一步:模拟示例数据

先构造一个贴近真实场景的示例数据集,方便演示操作:

library(dplyr)
library(tidyr)

# 设置随机种子保证结果可复现
set.seed(123)
# 生成日期序列
dates <- seq(as.Date("2024-01-01"), as.Date("2024-01-10"), by = "day")
# 生成包裹ID
package_ids <- rep(c("PKG001", "PKG002", "PKG003"), each = 10)
# 生成位置ID(包含连续多日不变的情况)
location_ids <- c(
  rep(1,3), rep(2,4), rep(1,3),  # PKG001:1→2→1
  rep(5,5), rep(3,5),             # PKG002:5→3
  rep(7,2), rep(9,3), rep(7,5)    # PKG003:7→9→7
)

# 组合成DataFrame
df <- tibble(
  date = rep(dates, 3),
  package_id = package_ids,
  location_id = location_ids
)

第二步:生成位置变更追踪表

核心思路是按包裹分组,对比当日与前一日的位置ID,筛选出位置发生变化(或初始位置)的记录,还可以额外添加位置的持续时间段:

location_changes <- df %>%
  # 先确保每个包裹的记录按日期排序(关键!)
  arrange(package_id, date) %>%
  # 按包裹分组处理
  group_by(package_id) %>%
  # 标记位置是否发生变更:第一条记录(初始位置)或当日位置≠前一日位置
  mutate(
    location_changed = ifelse(is.na(lag(location_id)), TRUE, location_id != lag(location_id))
  ) %>%
  # 只保留位置变更的记录
  filter(location_changed) %>%
  # 可选:添加当前位置的结束日期(下一次变更的前一天)
  mutate(end_date = lead(date) - 1) %>%
  # 最后一条记录的结束日期设为该包裹的最后观测日期
  replace_na(list(end_date = max(date))) %>%
  # 整理列名并取消分组
  select(package_id, start_date = date, location_id, end_date) %>%
  ungroup()

# 查看结果
print(location_changes)

输出结果示例

运行后会得到这样的追踪表,清晰展示每个包裹的位置变更时间和持续区间:

# A tibble: 8 × 4
  package_id start_date location_id end_date  
  <chr>      <date>           <dbl> <date>    
1 PKG001     2024-01-01           1 2024-01-03
2 PKG001     2024-01-04           2 2024-01-07
3 PKG001     2024-01-08           1 2024-01-10
4 PKG002     2024-01-01           5 2024-01-05
5 PKG002     2024-01-06           3 2024-01-10
6 PKG003     2024-01-01           7 2024-01-02
7 PKG003     2024-01-03           9 2024-01-05
8 PKG003     2024-01-06           7 2024-01-10

处理日期缺失的特殊情况

如果你的原始数据存在部分日期缺失(比如某包裹某天没有记录),可以先补全日期并填充缺失的位置ID(假设包裹位置不变),再进行上述操作:

# 补全每个包裹的所有日期
df_complete <- df %>%
  group_by(package_id) %>%
  complete(date = seq(min(date), max(date), by = "day")) %>%
  # 用前一天的位置填充缺失值
  fill(location_id, .direction = "down") %>%
  ungroup()

# 再用之前的方法处理df_complete即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:20:19