R如何按车辆分组累计指定日期前里程并合并两个数据框
R按分组+日期范围累加合并数据框实现方案
核心实现逻辑
- 首先将两个数据框的日期列从字符串格式转换为R的
Date类型,避免字符串比较出现逻辑错误 - 按车辆编号分组,对每个磨损测量日期,匹配同车辆所有里程记录日期早于等于测量日期的记录,累加对应行驶里程值
- 没有匹配到的记录返回累计值为0
方法1:tidyverse实现(适合小数据量,可读性高)
# 加载依赖包 library(tidyverse) # 示例数据初始化 measure = data.frame(car = c("A", "A", "A", "B"), data1 = c("20-09-2020", "15-10-2020", "13-05-2021", "20-10-2021"), palette = c(5,4,3,5)) dist_ = data.frame(car = c("A", "C", "B", "A", "A", "A"), data2 = c("20-09-2020", "14-05-2020", "20-10-2021", "10-01-2021", "11-01-2021", "13-01-2021"), distance = c(10, 20, 10, 5, 3,8)) # 转换日期格式,%d-%m-%Y对应 日-月-年 格式,若实际日期格式不同可调整该参数 measure <- measure %>% mutate(data1 = as.Date(data1, format = "%d-%m-%Y")) dist_ <- dist_ %>% mutate(data2 = as.Date(data2, format = "%d-%m-%Y")) # 按行计算累计里程 result <- measure %>% rowwise() %>% mutate( distance = sum(dist_$distance[dist_$car == car & dist_$data2 <= data1], na.rm = TRUE) ) %>% ungroup() # 若需要将日期转回原字符串格式,可加以下行 # result <- result %>% mutate(data1 = format(data1, "%d-%m-%Y"))
方法2:data.table实现(适合大数据量,运算效率更高)
library(data.table) # 转换为data.table格式 setDT(measure) setDT(dist_) # 转换日期格式 measure[, data1 := as.Date(data1, format = "%d-%m-%Y")] dist_[, data2 := as.Date(data2, format = "%d-%m-%Y")] # 非等值左连接后分组求和 result <- dist_[measure, on = .(car, data2 <= data1)] %>% .[, .(palette = first(palette), distance = sum(distance, na.rm = TRUE)), by = .(car, data1)]
结果校准说明
如果输出结果和预期存在差异,优先检查日期转换的format参数是否和实际日期的排列规则匹配,例如%m-%d-%Y对应月-日-年格式,%Y-%m-%d对应年-月-日格式。
内容的提问来源于stack exchange,提问作者DR15
相关产品推荐
相关产品推荐

