如何从向量中删除大于向量中先前值的值

问题描述 投票:0回答:1

我正在处理汽车的大型数据集(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 中做好这件事。

感谢您抽出时间,如果我未能全面描述问题或者您需要更多信息,请告诉我。

r data.table processing-efficiency deployr
1个回答
0
投票

我们可以在这里使用

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
© www.soinside.com 2019 - 2024. All rights reserved.