【问题标题】:R: How do I calculate the maximum value seen so far in a variable for each ID [duplicate]R:如何计算到目前为止在每个 ID 的变量中看到的最大值 [重复]
【发布时间】:2017-07-03 14:08:37
【问题描述】:

我在R 中有以下数据框,称为df

id<-c(1,1,1,1,2,3,3,3,3)
day<-c(1,2,4,5,2,2,3,6,8)
payment<-c(5,10,3,30,23,40,20,10,50)
df<-data.frame(id,day,payment)

 id  day  payment
  1   1       5
  1   2      10
  1   4       3
  1   5      30
  2   2      23
  3   2      40
  3   3      20
  3   6      10
  3   8      50

我要做的是创建一个名为 soFarMax 的新变量,它表示相关联的 id 到那一天为止的最大付款:

  id  day   payment SoFarMax
  1   1       5       5
  1   2      10       10
  1   4       3       10
  1   5      30       30
  2   2      23       23
  3   2      40       40
  3   3      20       40
  3   6      10       40
  3   8      50       50

非常感谢您对此提供的帮助。

【问题讨论】:

  • ?cummax..
  • 谢谢@Frank 不知道!
  • 如果您有兴趣,请使用 base R ave(df$payment, df$id, FUN = cummax)
  • @RonakShah 你能详细说明一下吗?还有stackoverflow.com/questions/34069496/…,尽管 akrun 将它与当前的相比。
  • 好的,谢谢@Ronak。这是另一个:stackoverflow.com/q/34069496我编辑了目标,将取消重复,其他人可以选择更合适的重复,可能来自我的链接。

标签: r


【解决方案1】:

我认为您需要使用窗口函数按此与 ID 进行分组(为此使用 dplyr 或子集) 然后使用cummax(x) 或者你可以使用逻辑

df$sofarmax<-ifelse(df$payment[i]>df$payment[i-1],df$payment[i],df$payment[i-1])

【讨论】:

    【解决方案2】:

    使用 dplyr

    df %>%
    group_by(id) %>%
    mutate(SoFarMax = cummax(payment))
    

    【讨论】:

    • @RonakShah 谢谢。修好了!
    【解决方案3】:
    SoFarMax <- unlist(tapply(df[,3], df[,1], cummax))
    

    如果您的订单前几天没有必要在您的数据框中已经有订单:

    df_order <- df[order(df[,2]),]
    SoFarMax <- unlist(tapply(df_order[,3], df_order[,1], cummax))
    

    【讨论】:

      【解决方案4】:

      感谢@Frank,关键显然是cummax。这是我设法想出的:

      library(data.table)
      df<-data.table(df)
      df<-df[,MaxSoFar:=cummax(payment),by=list(id)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多