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

