如何根据特定条件用来自其他字段的 max/min 值替换字段中的值?
How do you replace values in a field with max/min values from other fields subject to particular conditions?
这是前一个问题的扩展:。
给定 Category1、Category2、Type、Index 和 Date,我想创建一个名为 的新字段New_Date 如下。 New_Date 将是 Date 对应于属于每个组合的最高 Index Category1 和 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)
类别 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
这是前一个问题的扩展:
给定 Category1、Category2、Type、Index 和 Date,我想创建一个名为 的新字段New_Date 如下。 New_Date 将是 Date 对应于属于每个组合的最高 Index Category1 和 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)
类别 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