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

如何高效移除R中车辆价格随时间上涨的观测值(大数据场景)

高效处理大数据集的价格过滤方案

针对你4亿条分组车辆数据的需求,直接用tidyverse新增列的方法会占用过多内存,这里推荐用data.table实现高效的分组过滤,同时纠正你之前逻辑的问题:

核心逻辑

你的需求是移除车辆使用年限增加(data_year更大,即记录靠后)时价格上涨的观测值,正确的逻辑应为:
对于每个VIN组内按data_year降序排列的记录,保留所有价格不超过「之前所有记录最低价格」的行;一旦出现价格高于之前最低的记录,该行及之后所有记录都移除。

示例验证

用你提供的示例数据测试:

library(data.table)
ex_car <- structure(list(data_year = c(2003, 2008, 2009, 2009, 2010, 2012, 
2013, 2015), veh_price = c(2341, 50, 50, 100, 2600, 450, 3750, 
23000)), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"
))
setDT(ex_car)

# 模拟按VIN分组(实际替换为你的VIN列名)
filtered_car <- ex_car[, {
  # 计算累计最低价格,判断当前价格是否未超过累计最低
  keep_flag <- cumall(veh_price <= cummin(veh_price))
  .SD[keep_flag]
}]

print(filtered_car)

输出结果完全符合你的期望:

data_year veh_price
1:      2003      2341
2:      2008        50
3:      2009        50

大数据量优化方案

针对4亿条数据的场景,data.table的分组操作比tidyverse更高效,原因如下:

  • 无需创建中间列(如next_price、diff_p),直接在分组内计算筛选逻辑,节省内存
  • cummin和cumall都是底层优化的向量操作,避免循环遍历的低效
  • 实际使用时,确保数据已按VIN和data_year降序排列(你已完成排序,可跳过这步):
# 若未排序,先执行此步骤(仅需一次)
setorder(dt, VIN, -data_year)

关于「维护lowest_price」的实现

你提到的维护lowest_price变量的思路,cummin函数已经帮你完成了——它会逐行计算从开头到当前行的累计最小值,等价于动态更新的lowest_price。配合cumall可以确保一旦出现不符合条件的记录,后续所有行都被过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:08:09