我正在处理汽车的大型数据集(4 亿个观测值)。每个条目都有一个 VIN 号码,将其识别为特定的汽车。我按 VIN 对数据集进行分组,因此每组是 1 辆车(通常有多个条目)。我目前正在使用部署程序包(我最近使用 tidyverse 学习了 R)。
我试图消除所有观察结果,其中车辆随着汽车老化而价格增加(随着时间的推移价值升值)。
让我们以 1 辆车为例,我删除了下面除了相关的 data_year(记录数据的年份)和 veh_price(车辆价格)之外的所有列:
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"
))
这些列已按 data_year 排序(降序)。如上所述,我试图从前行中过滤掉车辆价格增加的任何行。
data_year veh_price
2003 2341
2008 50
2009 50
2009 100
2010 2600
2012 450
2013 3750
所需的输出:
data_year veh_price
2003 2341
2008 50
2009 50
我考虑使用
mutate
和 lead
创建下一个值的新行,计算差异,然后过滤所有负值(见下文)
filtered_sample <- ex_car|>
mutate(
next_price = lead(veh_price),
diff_p = veh_price - next_price,
) |>
filter( diff_p >= 0)
但是我担心添加 2 列效率太低,无法在大型数据集上运行。有没有更好、更有效的方法来解决这个问题? (我听说 data.table 针对较大的操作进行了优化,有没有办法使用这个包来实现相同的目标?)
当我第一次处理这个问题时,我想到遍历向量一次,存储一个临时全局
lowest_price
变量(初始化为向量中的第一个值)。如果下一个价格低于或等于 (<=), set it as the new lowest_price
,如果大于 (>),则删除该值。
但是,我不知道如何在 R 中做好这件事。
感谢您抽出时间,如果我未能全面描述问题或者您需要更多信息,请告诉我。
我们可以在这里使用
cummin
:
ex_car %>%
filter(veh_price == cummin(veh_price))
# # A tibble: 3 × 2
# data_year veh_price
# <dbl> <dbl>
# 1 2003 2341
# 2 2008 50
# 3 2009 50