首页 > 解决方案 > 如何用受特定条件限制的其他字段的最大值/最小值替换字段中的值?允许重复条件

问题描述

这是此处先前问题的扩展:如何将字段中的值替换为受特定条件限制的其他字段的最大值/最小值?.

给定Category1Category2、和Type,我想创建一个新字段,如下所示。将是与属于另一个字段的每个组合的最高值对应的日期,并且服从另一个字段等于 1。IndexDateNew_DateNew_DateIndexCategory1Category2Type

data有超过 1m 的记录和 50 个字段。

注意:与上面链接的其他问题的区别在于该Index字段可能不是唯一的。如果它们重复,我们需要返回最新的max(Date).

Category1 <-c (rep("A",8),rep("B",3),rep("C",4))

Category2 <-c (rep("X",5),rep("Y",4),rep("Z",6))

Index <- c(rep(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 指数 日期 类型 新日期
一个 X 1 2020 年 1 月 1 日 1 2020 年 1 月 3 日
一个 X 2 2020 年 1 月 2 日 2 2020 年 1 月 5 日
一个 X 1 2020 年 1 月 3 日 1 2020 年 1 月 3 日
一个 X 4 2020 年 1 月 4 日 2 2020 年 1 月 5 日
一个 X 5 2020 年 1 月 5 日 2 2020 年 1 月 5 日
一个 是的 6 2020 年 1 月 6 日 1 2020 年 7 月 29 日
一个 是的 7 2020 年 1 月 7 日 1 2020 年 7 月 29 日
一个 是的 8 2020 年 7 月 29 日 1 2020 年 7 月 29 日
是的 1 2014 年 1 月 1 日 1 2014 年 1 月 1 日
Z 2 2014 年 1 月 2 日 2 2015 年 1 月 1 日
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 日

按照Ronak Shah的建议使用以下代码

setDT(df)[, New_Date := Date[match(max(Index[Type == 1]), Index)], .(Category1, Category2)]

在第三行中,R将与第一个匹配项匹配,并且New_Date01/01/2020代替01/03/2020.

非常感谢对上述代码的任何建议或细微改动!

标签: rdataframedata.table

解决方案


这是使用 package 解决问题的一种可能方法data.table

setDT(df)[, New_Date := max(Date[Index==max(Index)]), by=.(Category1, Category2, Type==1)]
 
#     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/05/2020
#  3:         A         X     1 01/03/2020     1 01/03/2020
#  4:         A         X     4 01/04/2020     2 01/05/2020
#  5:         A         X     5 01/05/2020     2 01/05/2020
#  6:         A         Y     6 01/06/2020     1 29/07/2020
#  7:         A         Y     7 01/07/2020     2 01/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/02/2014
# 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/2016
# 14:         C         Z     3 01/01/2016     2 01/01/2016
# 15:         C         Z     4 01/01/2017     1 01/01/2017

这是dplyr方法:

df %>%  
  group_by(Category1, Category2, Type==1) %>% 
  mutate(New_Date = max(Date[Index==max(Index)])) %>% 
  ungroup() %>% 
  select(-`Type == 1`)

推荐阅读