【问题标题】:How do you replace values in a field with max/min values from other fields subject to particular conditions?如何用受特定条件限制的其他字段的最大值/最小值替换字段中的值?
【发布时间】:2021-06-21 03:37:34
【问题描述】:

这是对上一个问题的扩展:How do you replace values in a field with max/min values from other fields?

鉴于 Category1、Category2、Type、IndexDate,我想创建一个名为 New_Date 的新字段,如下所示。 New_Date 将是 Date,它对应于属于 Category1 的每个组合的最高 Index Category2 服从另一个字段Type 等于 1。

我的数据框有 >1m 条记录和 50 个字段,因此希望有一个基于 setDT 的解决方案。

任何想法都非常感谢!

Category1<-c(rep("A",8),rep("B",3),rep("C",4))
Category2<-c(rep("X",5),rep("Y",4),rep("Z",6))
Index<-c(seq(1,8),seq(1:3),seq(1:4))
Date<-c("01/01/2020","01/02/2020","01/03/2020","01/04/2020","01/05/2020","01/06/2020","01/07/2020","29/07/2020","01/01/2014","01/02/2014","01/01/2015","01/01/2014","01/01/2015","01/01/2016","01/01/2017")
Type<-c(1,2,1,2,2,1,2,1,1,2,1,1,2,2,1)
Category1 Category2 Index Date Type New_Date
A X 1 01/01/2020 1 01/03/2020
A X 2 01/02/2020 2 01/03/2020
A X 3 01/03/2020 1 01/03/2020
A X 4 01/04/2020 2 01/03/2020
A X 5 01/05/2020 2 01/03/2020
A Y 6 01/06/2020 1 29/07/2020
A Y 7 01/07/2020 1 29/07/2020
A Y 8 29/07/2020 1 29/07/2020
B Y 1 01/01/2014 1 01/01/2014
B Z 2 01/02/2014 2 01/01/2015
B Z 3 01/01/2015 1 01/01/2015
C Z 1 01/01/2014 1 01/01/2017
C Z 2 01/01/2015 2 01/01/2017
C Z 3 01/01/2016 2 01/01/2017
C Z 4 01/01/2017 1 01/01/2017

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    对于Type = 1,获取Date 对应于max IndexCategory1Category2

    library(data.table)
    
    setDT(df)[, New_Date := Date[match(max(Index[Type == 1]), Index)], .(Category1, Category2)]
    df
    
    #    Category1 Category2 Index       Date Type   New_Date
    # 1:         A         X     1 01/01/2020    1 01/03/2020
    # 2:         A         X     2 01/02/2020    2 01/03/2020
    # 3:         A         X     3 01/03/2020    1 01/03/2020
    # 4:         A         X     4 01/04/2020    2 01/03/2020
    # 5:         A         X     5 01/05/2020    2 01/03/2020
    # 6:         A         Y     6 01/06/2020    1 29/07/2020
    # 7:         A         Y     7 01/07/2020    2 29/07/2020
    # 8:         A         Y     8 29/07/2020    1 29/07/2020
    # 9:         B         Y     1 01/01/2014    1 01/01/2014
    #10:         B         Z     2 01/02/2014    2 01/01/2015
    #11:         B         Z     3 01/01/2015    1 01/01/2015
    #12:         C         Z     1 01/01/2014    1 01/01/2017
    #13:         C         Z     2 01/01/2015    2 01/01/2017
    #14:         C         Z     3 01/01/2016    2 01/01/2017
    #15:         C         Z     4 01/01/2017    1 01/01/2017
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多