如何根据特定条件用来自其他字段的 max/min 值替换字段中的值?

How do you replace values in a field with max/min values from other fields subject to particular conditions?

这是前一个问题的扩展:

给定 Category1、Category2、Type、IndexDate,我想创建一个名为 的新字段New_Date 如下。 New_Date 将是 Date 对应于属于每个组合的最高 Index Category1Category2 的另一个字段 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)
类别 1 类别 2 索引 日期 类型 New_Date
一个 X 1 2020 年 1 月 1 日 1 2020 年 1 月 3 日
一个 X 2 2020 年 1 月 2 日 2 2020 年 1 月 3 日
一个 X 3 2020 年 1 月 3 日 1 2020 年 1 月 3 日
一个 X 4 2020 年 1 月 4 日 2 2020 年 1 月 3 日
一个 X 5 2020 年 1 月 5 日 2 2020 年 1 月 3 日
一个 Y 6 2020 年 1 月 6 日 1 2020/07/29
一个 Y 7 2020 年 1 月 7 日 1 2020/07/29
一个 Y 8 2020/07/29 1 2020/07/29
B Y 1 2014 年 1 月 1 日 1 2014 年 1 月 1 日
B Z 2 2014 年 1 月 2 日 2 2015 年 1 月 1 日
B Z 3 2015 年 1 月 1 日 1 2015 年 1 月 1 日
C Z 1 2014 年 1 月 1 日 1 2017 年 1 月 1 日
C Z 2 2015 年 1 月 1 日 2 2017 年 1 月 1 日
C Z 3 2016 年 1 月 1 日 2 2017 年 1 月 1 日
C Z 4 2017 年 1 月 1 日 1 2017 年 1 月 1 日

For Type = 1 获取 Date 对应于 max Index for Category1 and Category2.

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