R :根据按列更改分组中的前后值来查找最小值

new*_*bie 1 r reshape2 dplyr data.table

添加可复制性:

  data.frame(
product=c(rep("x",2),rep("y",3)),
price_category_from=c(10,20,10,20,30),
price=c(30,31,31,30,27)
Run Code Online (Sandbox Code Playgroud)

)

如下所示,我有一个表格,我想对其进行分组product并更改price_category_from列的值以找到最小值price。

product     price_category_from     price
  x                10                30
  x                20                31
  y                10                31
  y                20                30
  y                30                27
Run Code Online (Sandbox Code Playgroud)

如下所示,结果表应包含price.new用于更改列中值的最小price_category_from列。例如,price.new在产品的两行中x都是30因为类别的后续price值price_category_from更大。而对于产品y,每个后续price_category_from类别的最小值都会发生变化,因为下一个price值较小。

中的值price_category_from是按递增顺序排列的间隔。

product     price_category_from     price    price.new
  x                10                30        30
  x                20                31        30  **
  y                10                31        31
  y                20                30        30
  y                30                27        27
Run Code Online (Sandbox Code Playgroud)

我希望我能够解释这个问题。我非常感谢您的帮助(最好是data.table)。非常感谢您提前。

Ice*_*can 5

您可以使用cummin来获得 cumultive 最小值(所有值的最小值,直到给定值)

library(data.table)
setDT(df)

df[, price.new := cummin(price), by = product]

df
#    product price_category_from price price.new
# 1:       x                  10    30        30
# 2:       x                  20    31        30
# 3:       y                  10    31        31
# 4:       y                  20    30        30
# 5:       y                  30    27        27
Run Code Online (Sandbox Code Playgroud)

或与基地 R

df$price.new <- with(df, ave(price, product, FUN = cummin))
Run Code Online (Sandbox Code Playgroud)