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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:06